Linux进程间的IPC通信主要包括:Posix IPC和System IPC,今天我要讲的是命名管道FIFO,其他的以后再讲。
命名管道FIFO(first in,first out):
管道没有名字,所以管道只能用于有共同祖先进程的各进程之间,我们无法再没有亲缘关系的两个进程间用管道通信。
FIFO指代先进先出(first in, first out),FIFO类似管道,它是一个单向(半双工)数据流,不同于管道的是它与一个路径名关联,从而允许没有亲缘关系的进程
访问同一个FIFO,FIFO也称有名管道。
FIFO由mkfifo()函数创建。
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(char* pathname,mode_t mode);//成功返回0,失败返回-1
其中pathname是一个普通的unix路径名,它是该FIFO的名字。
mode参数指定文件权限位,类似open函数的第三个参数,其值由以下常量指定
S_IRUSR
S_IWUSR
S_IRGRP
S_IWGRP
S_IROTH
S_IWOTH
mkfifo已经包含了O_CREAT|O_EXCL(即要么重新创建要么返回报错:所指定的名字的FIFO已经存在)
如何要打开一个已经存在的FIFO改为用open函数
创建完FIFO后,要么打开为读要么打开为写,不能即打开为读又打开为写,因为FIFO是半双工的。
对管道或FIFO的write总是往末尾添加数据,对他们的read总是从开头取数据,对他们调用lseek会报错