管道使用起来很方便,但是没有名字,因此只能用于具有亲缘关系的进程之间进行通信,而有名管道就克服了这一点,FIFO管道提供了一个路径名与之相对应,即使进程不是亲缘进程,只要能访问到该路径就能使用FIFO进行通信。
有名管道的创建:
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
int mkfifo(const char *pathname, mode_t mode);
第一个参数是创建的FIFO的路径名字,如果存在该路径,那么会返回EEXIT错误。
第二个参数和打开普通文件的open函数的mode参数一样。
一般文件的IO函数都可以用于FIFO,有名管道和管道相比,其多了一个打开的操作,使用open函数打开已经创建的FIFO。
如果当前操作是为读而打开FIFO,那么必须保证此时有一个进程为写而打开改FIFO,否则会阻塞的等待有一个进程为写而打开该FIFO。
如果当前操作是为写而打开FIFO,那么必须保证此时有一个进程为读而打开该FIFO,否则会阻塞的等待有一个进程为读而打开该FIFO。