- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 进程间通信· 信号量· 共享内存· 进程间通信的常用方式· 管道· 消息队列目录页Part 4Part 1Part 3Part 2管道消息队列信号量共享内存目录页Part 4Part 1Part 3Part 2共享内存管道消息队列信号量第8章 进程间通信Linux系统中进程通信的机制继承自Unix,后经贝尔实验室与BSD对进程间通讯手段的改进与扩充,以及POSIX标准对Unix标准的统一,发展出如今Linux系统中使用的进程通信(IPC)机制,即包含管道通信、信号量、消息队列、共享内存以及socket通信等的诸多通讯机制。网络通信SystemV8.1 管道管道是一种最基本的进程通信机制,其实质是由内核管理的一个缓冲区,可以形象地认为管道的两端连接着两个需要进行通信的进程,其中一个进程进行信息输出,将数据写入管道;另一个进程进行信息输入,从管道中读取信息。管道的逻辑结构如图所示。图8-1 pipe/管道通信机制8.1 管道管道分为匿名管道(pipe)和命名管道(named pipe)。在进程中创建的管道是匿名管道,进程退出后管道会被销毁,匿名管道只能用于有亲缘关系的进程间通信。命名管道被具象化为一个文件,在进程中可使用操作文件的方式向内存中写入或从内存中读出数据,命名管道与进程的联系较弱,相当于一个读写内存的接口,进程退出后,命名管道依然存在。8.1.1 匿名管道匿名管道的使用流程如下:①在进程中创建匿名管道②关闭进程中不使用的管道端口③在待通信的进程中分别对管道的读、写端口进行操作④关闭管道pipe()函数close()函数read()/write()函数close()函数8.1.1 匿名管道pipe()函数存在于函数库unistd.h中,其函数声明如下:int pipe(int pipefd[2]);说明:①参数pipefd是一个文件描述符数组;②管道文件的实质是内核缓存区,借助文件系统中的file结构与VFS中的索引结点实现。8.1.1 匿名管道pipe()函数的参数pipefd是一个数组,当在程序中使用pipe()创建管道时,程序可以通过传参的方式,获取两个文件描述符,分别交给需要通信的两个进程,内核再将这两个进程中文件描述符对应file结构中的inode指向同一个临时的VFS索引结点,并使这个索引结点指向同一个物理页面。管道实现机制如图8-2所示。f_inode指向同一个inode图8-2 管道实现机制f_op指向不同的操作8.1.1 匿名管道匿名管道利用fork机制建立联系,刚创建出的管道,读写两端都连接在同一个进程上,当进程中调用fork()创建子进程后,父子进程共享文件描述符,因此子进程拥有与父进程相同的管道。pipe()创建管道后读端对应的文件描述符为fd[0],写端对应的文件描述符为fd[1],fork后父子进程中文件描述符与管道的关系如图8-3所示。图8-3 父进程fork出子进程8.1.1 匿名管道假设在父进程中进行写操作,在子进程中进行读操作,那么应使用close()函数关闭父进程中的读端与子进程中的写端。此后父子进程中文件描述符与管道的关系如图8-4所示。图8-3 父进程fork出子进程图8-4 父子进程文件描述符与管道间的关系8.1.1 匿名管道案例1:使用pipe()实现父子进程间通信,要求父进程作为写端,子进程作为读端。例8-1.docx点例8-1.docx击查看例8-1代码8.1.1 匿名管道有亲缘关系的进程,除父子外,还有兄弟进程等具备其它联系的进程,这些进程都依靠fork()创建,因此每个进程初始时都会有两个指向管道文件的文件描述符,实现这些进程间通信的实质,是关闭多个进程中多余的文件描述符,只为待通信进程各自保留读端或写端。假设要实现兄弟进程间的通信,那么系统中进程文件描述符与管道的关系如图8-5所示,其中实线所示的箭头为编程中需要保留的文件描述符。图8-5 兄弟进程间通信的管道实现8.1.1 匿名管道案例2:使用管道实现兄弟进程间通信,使兄弟进程实现命令“ls | wc –l”的功能。例8-2.docx点例8-2.docx击查看例8-2代码8.1.1 匿名管道管道是最简单的进程通信方式,但受自身数据传输机制的限制,使用管道时有以下几种情况需要注意:(1)管道采用半双工通信方式,只能进行单向数据传递,为严谨起见,应使用close()函数关闭除通信端口之外的端口。(2)管道只能进行半双工通信,若要实现同时双向通信,需要为通信的进程创建两个管道。(3)有指向管道读端的文件描述符打开时,向管道中写入数据才有意义。8.1.1 匿名管道管道是最简单的进程通信方式,但受自身数据传输机制的限制,使用管道时有以下几种情况需要注意:(4)若所有指向管道写端的文件描述符都被关
文档评论(0)