管道是linux系统的一种进程间通信机制,它是一个只存在于内存的特殊文件,并且数据只能单向流动,而且只能用于具有亲缘关系的进程间(即父子进程,兄弟进程),无亲缘关系的进程是不能使用的。
命名管道可以解决管道的局限性,即他可以使任意两个进程之间通信。命名管道是一个存在于硬盘上的文件。
有两个函数可以创建命名管道:
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);
命名管道和管道的使用方法相同,只是使用命名管道时必须使用open()函数将其打开。
值得注意的是:调用open()打开命名管道的进程可能会被阻塞,但如果同时用读写方式(O_RDWR)打开,则一定不会阻塞,如果以只读方式打开,则一定会阻塞直到有写的进程打开管道,同样以写的方式打开的时候也会被阻塞,直到有读的进程打开管道。
创建一个命名管道:
1 bool CGlobe::createPipe(const char *pipename) 2 { 3 struct stat buf; 4 if(access(pipename,F_OK)== 0)//判断文件是否存在 5 { 6 if(lstat(pipename,&buf) == 0)//获取文件状态信息 7 { 8 if(S_ISFIFO(buf.st_mode))//判断是否是FIFO文件 9 return true; 10 else if(unlink(pipename)<0)//删除文件 11 return false; 12 } 13 else 14 return false; 15 } 16 umask(0); 17 if( mknod(pipename,S_IFIFO|0666,0)== -1 )//创建FIFO文件 18 return false; 19 return true; 20 }
命名管道是有名有形的,为了使用这种管道Linux中设立了一个专门的特殊文件系统--管道文件,它存在于文件系统中,任何进程可以在任何时候通过命名管道的路径和文件来访问管道,但是在磁盘上的只是一个节点,而文件的数据则只存在于内存缓冲页面中与普通管道一样。