管道是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中设立了一个专门的特殊文件系统--管道文件,它存在于文件系统中,任何进程可以在任何时候通过命名管道的路径和文件来访问管道,但是在磁盘上的只是一个节点,而文件的数据则只存在于内存缓冲页面中与普通管道一样。

posted on 2016-03-25 16:59  江左醉风流  阅读(977)  评论(0编辑  收藏  举报