加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux进程间通信(二) 管道通信之无名管道及其基础实验

发布时间:2016-01-19 13:46:44 所属栏目:Linux 来源:网络整理
导读:管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输 入(其实我更愿意将管道比喻为农村浇地的管子)。Linux的管道主要包

3、管道读写说明

用 pipe() 创建的管道两端处于同一个进程中,由于管道主要是用于在不同的进 程间通信的,因此,在实际应用中没有太大意义。实际上,通常先是创建一个管道,再调用fork()函数创建一 个子进程,该子进程会继承父进程所创建的管道,这时,父子进程管道的文件描述符对应关系如下图

Linux进程间通信(二) 管道通信之无名管道及其基础实验

此时的关系看似非常复杂,实际上却已经给不同进程之间的读写创造了很好的条件。父子进程分别 拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或写端的文件描述符关闭即可。例如 ,图4中,将父进程的写端fd[1]和子进程的读端fd[0]关闭,则父子进程之间就建立起一条“子进程写入父进 程读取”的通道。   同样,也可以将父进程的读端fd[0]和子进程的写端fd[1]关闭,则父子进程之间就 建立起一条“父进程写入子进程读取”的通道

Linux进程间通信(二) 管道通信之无名管道及其基础实验

另外,父进程还可以创建多个 子进程,各个子进程都继承了相应的fd[0]和fd[1],此时,只需要关闭相应的端口就可以建立各子进程之间的 的通道。

4、管道读写注意点

●  只有在管道的读端存在时,向管道写入数据才有意义。 否则,向管道写入数据的进程将收到内核传来的 SIGPIPE 信号(通常为 Broken pipe错误)。

●  向管道写入数据时,Linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道 写入数据。如果读进程不读取管道缓冲区中的数据,那么写进程将会一直阻塞。

●  父子进程在 运行时,它们的先后次序并不能保证。因此,为了保证父子进程已经关闭了相应的文件描述符,可在两个进程 中调用 sleep()函数。当然,这种调用不是很好的解决方法,以后我会用进程之间的同步与互斥机制来修改它 的!

基础实验

本实验中,首先创建管道,之后父进程使用 fork()函数创建子进程,最后通过 关闭父进程的读描述符fd[0]和子进程的写描述符fd[1]来建立一个"父进程写入子进程读取"的管道 ,从而建立起它们之间的通信。

本实验代码如下,我上传到网站,pipe.c点此下载

Linux进程间通信(二) 管道通信之无名管道及其基础实验

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读