管道是linux系统的一种进程间通信机制,它是一个只存在于内存的特殊文件,并且数据只能单向流动,而且只能用于具有亲缘关系的进程间(即父子进程,兄弟进程),无亲缘关系的进程是不能使用的。
命名管道可以解决管道的局限性,即他可以使任意两个进程之间通信。命名管道是一个存在于硬盘上的文件。
有两个函数可以创建命名管道:
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);
命名管道和管道的使用方法相同,只是使用命名管道时必须使用open()函数将其打开。
值得注意的是:调用open()打开命名管道的进程可能会被阻塞,但如果同时用读写方式(O_RDWR)打开,则一定不会阻塞,如果以只读方式打开,则一定会阻塞直到有写的进程打开管道,同样以写的方式打开的时候也会被阻塞,直到有读的进程打开管道。
创建一个命名管道:
bool CGlobe::createPipe(const char *pipename)
{
struct stat buf;
if(access(pipename,F_OK)== 0)//判断文件是否存在
{
if(lstat(pipename,&buf) == 0)//获取文件状态信息
{
if(S_ISFIFO(buf.st_mode))//判断是否是FIFO文件
return true;
else if(unlink(pipename)<0)//删除文件
return false;
}
else
return false;
}
umask(0);
if( mknod(pipename,S_IFIFO|0666,0)== -1 )//创建FIFO文件
return false;
return true;
}
命名管道是有名有形的,为了使用这种管道Linux中设立了一个专门的特殊文件系统--管道文件,它存在于文件系统中,任何进程可以在任何时候通过命名管道的路径和文件来访问管道,但是在磁盘上的只是一个节点,而文件的数据则只存在于内存缓冲页面中与普通管道一样。
原文链接:https://www.qiquanji.com/post/8369.html
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
微信扫码关注
更新实时通知