9.2.1有名管道概念
无名管道是临时的,在完成通信后自动消息,因为文件描述符只能在某个进程中可见,因此被广泛用于具有亲缘关系的进程间通信,采用的方法是先创建管道,再创建进程,使子进程继承父进程创建的管道文件描述符。
有名管道FIFO有效克服了这一问题,它依赖于文件系统,是一个存在的特殊文件,实现不同进程对文件系统下的某个文件访问是非常方便实现的。因此,FIFO可以在同主机任意进程间实现通信。
有名管道和普通文件一样具有磁盘存放路径、文件权限和其他属性;但是,有名管道和普通文件又有区别,有名管道并没有在磁盘中存放真正的信息,他存储的通信信息在内存中,两个进程结束后自动消失,拥有一个磁盘路径仅仅是一个接口,其目的是使进程间信息的编程更简单统一。通信的两个进程结束后,有名管道的文件路径本身依然存在,这是和无名管道不一样的。
9.2.2有名管道及其特殊性
1.创建有名管道
mkfifo用来创建有名管道,它有两个参数,分别用来指定生成的管道和该管道的文件属性,char *__path为要创建的管道文件名,mode为生成文件的模式。此函数声明:
extern int mkfifo(__const char *__path, __mode_t __mode);
mkfifo会根据参数建立特殊的有名管道文件,该文件必须不存在,而参数mode为该文件的权限,mkfifo建立的fifo文件的其他进程都可以用读写一般文件的方式存取。当使用open函数打开fifo文件时,O_NONBLOCK会有影响。