管道实现进程之间通信

1 实现原理

 内核借助环形队列机制,使用内核缓冲区实现。

2 特质

1. 伪文件

2. 管道中的数据只能一次读取。

3. 数据在管道中,只能单向流动。

3 局限性

1. 自己写,不能自己读。

2. 数据不可以反复读。

3. 半双工通信。

4. 血缘关系进程间可用。

4 使用

int pipe(int fd[2]);

参数: fd[0]: 读端,fd[1]: 写端。

返回值: 成功: 0

失败: -1 errno

实现时应该先创建管道,后fork进程。

其pipe函数会创建管道的两个方向的文件,但是需要控制其方向只能为单向,需要关闭一定的文件描述符才能够执行。虽然是单向的操作,但是其可以一个读端,多个写端,或者多个读端,一个写端。

其次,对于管道为我们打开的文件,可以直接使用文件操作,read,write函数进行操作。

5 读写管道操作

读管道:

1. 管道有数据,read返回实际读到的字节数。

2. 管道无数据:

1)无写端,read返回0 (类似读到文件尾)

2)有写端,read阻塞等待。

写管道:

1. 无读端, 异常终止。 (SIGPIPE导致的)

2. 有读端:

1) 管道已满, 阻塞等待

2) 管道未满, 返回写出的字节个数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值