1、概述
管道:是最初的Unix IPC形式,但是没有名字只能有亲缘关系的进程使用。FIFO有时称为有名管道,可以在任意进程间使用。
2、管道
#include
int pipe(int fd[2]);
返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。
宏S_ISFIFO用于确定一个文件描述符fd是管道还是FIFO
3、popen和pclose
popen函数创建一个管道并启动另外一个进程,该进程要么从管道中读出,要么往管道中写入。
4、FIFO
FIFO称为有名管道,是一个单向数据流,不能打开一个FIFO之后即往里读又往里写。
#include
#include
定义函数
int mkfifo(const char * pathname,mode_t mode);
若成功则返回0,否则返回-1,错误原因存于errno中。
5、管道和FIFO属性
对于一个描述符有两种方式设置其为非阻塞
(1)调用open时指定O_NONBLOCK标志
(2)如果一个描述符已经打开,那么可以调用fcntl以启用O_NONBLOCK标志。
对于管道只能使用fcntl方法设置,因为管道没有open函数,设置时应当先获取在或上O_NONBLOCK标志然后设置。
6、管道和FIFO的限制
(1)OPEN_MAX,一个进程在任意时刻打开的最大描述符数。
(2)PIPE_BUF,可原子的往一个管道或者FIFO里写的最大数量
可以使用pipeconf /名称查询该值,可使用uimit -ns 512设置OPEN_MAX