(匿名)管道两端分别用描述符pipefd[0]及pipefd[1]来描述。需要注意的是,管道两端的任务是固定的,一端只能用于读,有描述符pipefd[0]表示,称其为管道读端;另一端只能用于写,由描述符pipe[1]来表示,称其为管道写端。
该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信。在此不再作多介绍,下面看看有名管道吧。
管道的一个不足之处就是没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(name pipe或FIFO)提出后,该限制得到了解决。FIFO不同与管道之处在与她提供一个路径名与之关联,以FIFO的文件形式存储在文件系统中。有名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信了。值得注意的是FIFO(First In First Out)总是按照先进先出的原则工作,第一个被写入的数据首先从管道中读出。
在Linux中我们经常使用管道重定向数据。比如:
下面介绍一下创建有名管道的系统调用,有两个,mknod和mkfifo
#include
#include
int mknod(const char *pathname, mode_t mode, dev_t dev);
int mkfifo( const char *pathname, mode_t mode );
函数mknod参数中pathname为创建有名管道的全路径名,mode为创建有名管道的模式,指明其存取权限;dev为设备值,该值取决于文件创建的种类,它只在创建设备文件是才会用到。这两个函数调用成功都返回0,否则返回-1.