- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第14 章 进程间通信
进程间通信 IPC(Interprocess Communication)是在 Linux/UNIX 下编程经常会碰到的
问题,它的实际意义在于怎么样让多个进程可以互相的访问数据。在 Linux/UNIX 环境下
可以由多种方式来实现上述的问题,接下来将详细为读者介绍这几种方式的具体操作以及
相关内容。
14.1 进程间通信概述
进一个大型的应用系统,往往需要众多进程协作,进程间通信的重要性显而易见。本
章阐述了 Linux 环境下的几种主要进程间通信手段,并针对每个通信手段的关键技术环节
给出详细实例。为达到阐明问题的目的,本章还对某些通信手段的内部实现机制进行了
分析。
14.1.1 进程间通信简介
在早期,UNIX 系统 IPC 就是进程间通信方式的统称,进程间通信就是可以让多个进
程可以互相之间访问。这种访问包括程序运行的适时数据,也包括对方的代码段,这是在
实际应用中及其常见的问题,进程间通信示意图如图 14-1 所示。
图 14-1 进程间通信简介
第 14 章 进程间通信
上图所示进程间通信的模式,进程 A 和进程B 在运行的过程中会需要一些外部的数据,
IPC 为两个进程提供了一种数据传输的通道。
14.1.2 进程间通信的难点
由于现在应用程序的体积逐渐增大,用户对软件的功能要求也越来越多,所以多进程
设计已经是应用技术中不可缺少的一部分,这同时也对进程间通信提出了挑战。
进程运行期间,其地址空间对于其他进程是不可见的(这只是传统上的进程概念,在
本章后续章节中 IPC 内存共享机制打破了这个概念),在系统中它们是相对独立的,并不
能互相访问对方,如图 14-2 所示。
图 14-2 进程在内存中的地址
Linux/UNIX 系统提供一种中间转发的机制,为多个进程建立起互相通信的数据通道。
在上述问题中,当进程 A 与进程 B 通信时,通过中间的 IPC 方式来转发数据到目标进程。
14.1.3 IPC 的多种方式
Linux/UNIX 系统下,进程间通信方式有着比较多的应用技术。进程间通信方式从最简
单的使用文件系统实现多进程共享文件数据、以及父子进程共享数据段,到高级应用的管
道以及共享内存、信号灯。
IPC 是所有 UNIX 系统中各种进程间通信的统称,如表 14-1 所示,列出了所有进程间
通信的方式。
表14-1 IPC类型
IPC 类型 详 细 说 明
半双工管道
半双工管道: 匿名半双工管道 FIFO(First In First Out 命名半双工管道)
全双工管道: 匿名全双工管道 命名全双工管道
System V IPC / POSIX IPC 消息队列 信号量 共享存储
网络进程间通信 SOCKET STREAMS
·417·
Linux C 程序设计大全
上表内容中,全双工管道是在最近才出现的一种技术,它是在半双工管道上的扩充,
在有的系统中是不被支持的,在实际应用的过程中请参阅相应的系统手册。
注意:其余的技术中,在不同的系统中会有不同的限制,以及不同的特点。本书只描述
它们共有的特性。如需特别需求,请参阅相应的系统手册。
14.2 管 道
管道通信是最常见的通信方式之一,其是在两个进程之间实现一个数据流通的管道,
该管道可以是双向或单向的。管道是一种很经典的进程之间的通信方式,其优点在于简单
易用,其缺点在于功能简单,有很多限制。本小节主要介绍管道操作。
14.2.1 管道的概念
管道是 Linux/UNIX 系统中比较原始的进程间通信形式,它实现数据以一种数据流的
方式,在多进程间流动。在系统中其相当于文件系统上的一个文件,来缓存所要传输的数
据。在某些特性上又不同于文件,例如,当数据读出后,则管道中就没有数据了,但文件
没有这个特性。
匿名半双工管道在系统中是没有实名的,并不可以在文件系统中以任何方式看到该管
道。它只是进程的一种资源,会随着进程的结束而被系统清除。管道通信是在 UNIX 系统
中应用比较频繁的一种方式,例如使用 grep 查找。
# ls | grep ipc
上述命令中使用的是半双工管道,即 grep 命令的输入是 ls 命令的输出。管道从数据流
动方向上又分全双工管道以及半双工管道,当然全双工管道现在某些系统还不支持,其在
具体的实现过程中也只是在文件打开的方式上有一点区别(在操作规则上也有一些不同,
全双工管道要相比半双工复杂的多)。
14.2.2 匿名半双工管道
匿名管道没有名字,对于管道中使用的文件描述符没有路径名,也就是不存在任何意
义上的文件,它们只是在内存中跟某一个索引节点相关联的两个文件描述符。匿名半双工
管道的主要特性如下:
? 数据只能在一个方向上移动。
? 只能在具有公共祖先的进程间通信,即或是父子关系进程间、或
文档评论(0)