利用管道实现多进程间通信

管道(问题理解)

管道是linux系统最常见的进程间通信方式之一,它在两个进程之间实现一个数据流通的通道,数据以一种数据流的方式在进程间流动。它把一个程序的输出直接连到另一个程序的输入。

解决方案

管道可以分为以下两种,利用这两种管道可以实现进程间的通信,但是对于进程间的关系会有所限制
解决和代码方法如下,数据以字符为例,通信的内容为姓名和学号。

管道分类

(一)无名管道

无名管道属于linux中管道通信的一种原始方法

特点

(1)它只能用于具有亲缘关系的进程之间的通信(即父子进程或兄弟进程之间)
(2)它是一个半双工的通信模式,具有固定的读端和写端
(3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()和write()函数。但是它不是普通的文件,不属于其他任何文件系统,并且只存在于内存中。

实现

在这里插入图片描述代码如上图,fd[0]表示读端,fd[1]表示写端,我们fork()一个子进程,在父进程中将管道的读端关闭,利用write函数写入一串字符后使用wait函数让父进程等待,在子进程中关闭管道的写端,利用read函数读入管道中的字符串然后让其在屏幕输出。

结果如图
在这里插入图片描述

(二)有名管道

有名管道是对无名管道的一种改进

特点

(1)它可以使两个互不相关的两个进程实现彼此通信
(2)该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立管道之后,两个进程可以把它当作普通文件一样进行读写操作
(3)有名管道严格遵循先进先出规则,对管道的读总是从开始处返回数据,对于写则是把数据添加到末尾,它们不支持如seek()等文件定位操作

实现

vim fifo_w.c
写端代码
在这里插入图片描述
vim fifo_r.c
读端代码
在这里插入图片描述
结果
打开终端输入如下
在这里插入图片描述
同时打开另一个终端
在这里插入图片描述

感想

利用管道实现多进程间的通信属于比较常见的,这个通信的过程还是比较好理解的,比实现生产者和消费者问题要容易一些。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值