- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
下载
下载
下载
第19章 有关进程通信的编程
本章介绍有关L i n u x系统进程间通信的内容。
19.1 进程间通信简介
Linux 系统中的IPC (InterProcess Co m m u n i c a t i o n )函数提供了系统中多个进程之间相互通信
的方法。对于L i n u x系统中的C语言程序员来说,系统中包括如下几种方式的 I P C :
• 半双工UNIX 管道。
• FIFO(命名管道) 。
• SYSV 风格的消息队列。
• SYSV 风格的信号量设置。
• SYSV 风格的共享内存段。
• 网络套接口 (Berkeley 风格) 。
• 全双工管道 (STREAMS 管道) 。
以上的这些函数,如果使用得当的话,提供了在U N I X系统(当然也包括L i n u x系统)上开
发客户机/服务器模式应用程序的有效工具。
19.2 半双工UNIX管道
19.2.1 基本概念
简单地说,管道就是一种连接一个进程的标准输出到另一个进程的标准输入的方法。管道
是最古老的I P C工具,从U N I X系统一开始就存在。它提供了一种进程之间单向的通信方法。管
道在系统中的应用很广泛,即使在 s h e l l环境中也要经常使用管道技术。
当进程创建一个管道时,系统内核设置了两个管道可以使用的文件描述符。一个用于向管
道中输入信息 ( w r i t e ) ,另一个用于从管道中获取信息 ( r e a d ) 。在这一点上,管道没有多少的实
际用途,因为创建管道的进程只能使用管道和进程自己通信。
如果进程通过管道f d 0来发送数据,它可以通过 f d 1来读取此数据。当管道最初和进程连接
时,在管道中传送数据是通过内核进行的。在 L i n u x 系统环境下,管道最初在系统内核中都是
使用索引节点表示的。当然,此索引节点保存在内核之中,而并不存在于任何的物理文件系统
中。这就为我们提供了一种特别方便地使用I / O 的方法,这一点我们以后将会看到。
这时,管道基本上是没有任何用的,因为进程没有必要和自己进行通信。通常的做法是进
程派生出一个子进程。因为子进程将会继承父进程中所有打开的文件描述符,那么我们就可以
在父进程和子进程之间通信了。
一个简单的管道创建完了。下面介绍如何使用管道。如果要直接存取管道,可以使用和低
级的文件I / O 同样的系统调用,因为在系统内核中管道实际上是由一个有效的索引节点表示的。
如果希望向管道中发送数据,可以使用系统调用 w r i t e ( ) ,反之,如果希望从管道中读取数
据,可以使用系统调用r e a d ( ) 。虽然大部分低级的文件I / O系统调用可以使用文件描述符,但一
182计计第四篇 Linux 系统高级编程
下载
些系统调用,例如l s e e k ( )不能通过文件描述符使用管道。
19.2.2 使用C语言创建管道
使用C语言创建管道要比在 s h e l l下使用管道复杂一些。如果要使用 C语言创建一个简单的
管道,可以使用系统调用 p i p e ( ) 。它接受一个参数,也就是一个包括两个整数的数组。如果系
统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程
将产生一个新的进程。
系统调用:p i p e ( ) ;
原型:int pipe( int fd[2] ) ;
返回值:如果系统调用成功,返回0
如果系统调用失败返回- 1 :errno = EMFILE (没有空闲的文件描述符)
EMFILE (系统文件表已满)
E FA U LT (fd 数组无效)
注意 fd[0] 用于读取管道,f
文档评论(0)