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

点之六大进程通信机制

发布时间:2021-04-07 10:15:23 所属栏目:传媒 来源:互联网
导读:思义,进程通信( InterProcess Communication,IPC)就是指「进程之间的信息交换」。实际上,「进程的同步与互斥本质上也是一种进程通信」(这也就是待会我们会在进程通信机制中看见信号量和 PV 操作的原因了),只不过它传输的仅仅是信号量,通过修改信号量,

思义,进程通信( InterProcess Communication,IPC)就是指「进程之间的信息交换」。实际上,「进程的同步与互斥本质上也是一种进程通信」(这也就是待会我们会在进程通信机制中看见信号量和 PV 操作的原因了),只不过它传输的仅仅是信号量,通过修改信号量,使得进程之间建立联系,相互协调和协同工作,但是它「缺乏传递数据的能力」。

虽然存在某些情况,进程之间交换的信息量很少,比如仅仅交换某个状态信息,这样进程的同步与互斥机制完全可以胜任这项工作。但是大多数情况下,「进程之间需要交换大批数据」,比如传送一批信息或整个文件,这就需要通过一种新的通信机制来完成,也就是所谓的进程通信。

再来从操作系统层面直观的看一些进程通信:我们知道,为了保证安全,每个进程的用户地址空间都是独立的,一般而言一个进程不能直接访问另一个进程的地址空间,不过内核空间是每个进程都共享的,所以「进程之间想要进行信息交换就必须通过内核」。上这行代码就组成了一个管道,它的功能是将前一个命令(command1)的输出,作为后一个命令(command2)的输入,从这个功能描述中,我们可以看出「管道中的数据只能单向流动」,也就是半双工通信,如果想实现相互通信(全双工通信),我们需要创建两个管道才行。

另外,通过管道符 | 创建的管道是匿名管道,用完了就会被自动销毁。并且,匿名管道只能在具有亲缘关系(父子进程)的进程间使用,。也就是说,「匿名管道只能用于父子进程之间的通信」。

在 Linux 的实际编码中,是通过 pipe 函数来创建匿名管道的,若创建成功则返回 0,创建失败就返回 -1:数拥有一个存储空间为 2 的文件描述符数组:

fd[0] 指向管道的读端,fd[1] 指向管道的写端

fd[1] 的输出是 fd[0] 的输入

粗略的解释一下通过匿名管道实现进程间通信的步骤:

1)父进程创建两个匿名管道,管道 1(fd1[0]和 fd1[1])和管道 2(fd2[0]和 fd2[1]);

因为管道的数据是单向流动的,所以要想实现数据双向通信,就需要两个管道,每个方向一个。

2)父进程 fork 出子进程,于是对于这两个匿名管道,子进程也分别有两个文件描述符指向匿名管道的读写两端;

3)父进程关闭管道 1 的读端 fd1[0] 和 管道 2 的写端 fd2[1],子进程关闭管道 1 的写端 fd1[1] 和 管道 2 的读端 fd2[0],这样,管道 1 只能用于父进程写、子进程读;管道 2 只能用于父进程读、子进程写。管道是用「环形队列」实现的,数据从写端流入从读端流出,这就实现了父子进程之间的双向通信。

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

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

    推荐文章
      热点阅读