管道和FIFO

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标志然后设置。



O_NONBLOCK标志对管道和FIFO的影响

​6、管道和FIFO的限制

(1)OPEN_MAX,一个进程在任意时刻打开的最大描述符数。

(2)PIPE_BUF,可原子的往一个管道或者FIFO里写的最大数量

可以使用pipeconf /名称查询该值,可使用uimit -ns 512设置​OPEN_MAX

posted @ 2016-11-27 14:18  luizp  阅读(191)  评论(0编辑  收藏  举报