管道和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函数创建一个管道并启动另外一个进程,该进程要么从管道中读出​,要么往管道中写入。该函数并不会等待fork出来的进程执行完成才返回,而是直接返回,当前进程和fork出来的进程并行运行,执行完该函数后父进程和子进程之间生成一条管道,函数返回值为FILE结构指针,该指针作为管道的一端,为父进程所拥有。子进程则拥有管道的另一端,该端口为子进程的stdin或者stdout。如果type=r,那么该管道的方向为:子进程的stdout到父进程的FILE指针;如果type=w,那么管道的方向为:父进程的FILE指针到子进程的stdin。



linux下的system和popen都能完成类似的功能,但是 system和popen是有区别的,所有在调用popen之后应该要调用pclose关闭句柄否则子进程将变成僵尸进程。

​4、FIFO

FIFO称为有名管道,是一个单向数据流,不能打开一个FIFO之后即往里读又往里写。system执行期间会一直等待子进程执行结束才返回,而popen不会。可以理解为system和子进程事串行运行,而popen是并行运行。

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值