进程间通信(9章后讲)45.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
进程间通信(9章后讲)45

在Linux系统中,通常不可能在同一时刻只有单个进程在运行。对于一个多进程系统来说,各个进程之间往往不是相互独立的。很多情况下,各个进程间需要进行信息交换,因此,进程间的通信是必不可少的。 进程间通信是现代程序设计的重要手段。借助于进程间通信的使用,可以建立分布式的应用程序。 7.1进程间通信简介 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。 进程间通信(IPC)是用于处理一个多进程系统中各个进程之间的协调。 所谓进程间通信,就是指多个进程之间相互通信、交换信息的办法。 常见的进程间通信的方法包括以下几种。 共享内存 信号量 管道 只适用于本地进程间通信 命名管道 消息队列 套接口 全双工管道 可用于远程通信,因而一般用于网络编程 7.3 管道通信 管道是一种特殊的文件,它的主要用途是实现进程间的通信。 管道的一个显著特点是: 当一个管道建立后,将获得两个文件描述符,分别用于对管道读取和写入,通常将其称为管道的写入端和管道的读取端,从写入端写入管道的任何数据都可以从读取端读取。 对一个进程来说,管道的写入和读取操作与写入和读取一个普通文件没有区别,只是在内核中通过这种机制来实现进程间的通信。 管道的局限性: 管道只能用于两个进程间的通信,而不能用于多个进程。 进行通信的两个进程要有同源性,即它们必须使最终由同一个进程所派生的进程。 管道是半双工方式的,即只允许单方向传输数据。 7.3.1 管道的创建和关闭 管道是一种最基本的IPC机制,由pipe函数创建: 此函数用于创建一个管道。参数filedes是一个两元整型数组,用于存放调用该函数所创建管道的两个文件描述符。 filedes [0] 存放管道读取端的文件描述符 filedes [1]存放管道写入端的文件描述符。 调用成功时,返回值为0;调用失败时,返回值为-1。 #include unistd.h int pipe(int filedes[2]); 调用pipe函数创建了一个管道后,还不能实现通过管道在两个进程间通信的目的。因为此时管道的读入端和写入端的文件描述符都属于同一进程。 进程只能将打开的文件描述符传递给它的子进程。通常的做法是: 在pipe函数调用完成后,调用fork函数派生一个子进程,需要时调用exec函数族使子进程执行所需程序。 根据数据传输的方向分别关闭父进程和子进程中的一个文件描述符。如 要实现父进程向子进程的数据传输,则关闭父进程的读取端文件描述符和子进程的写入端文件描述符。 管道的关闭 当一个管道使用结束后,可以像关闭一个普通文件一样调用close函数将其关闭。但要注意需在两个进程中分别关闭管道的两端。 例子: 创建一个由父进程向子进程传输数据的管道 7.3.2 管道的读写操作 由于管道是一种特殊的文件,用户在使用中完全可以像读写普通文件一样对管道进行读写,所使用的函数为read和write。 当向一个读取端文件描述符已经关闭了的管道中写入数据时,将产生SIGPIPE 信号,使用write函数将errno设置为出错值。 系统定义的常数PIPE_BUF规定了管道缓冲的大小,当写放数据超过规定的大小时,将会使数据发生交错。 当一个进程从读取端读数据时,如果管道中的全部数据已读完,则read函数认为读到了文件末尾,返回值为0。但有可能数据的写入并没有结束,写入管道的进程还有数据要传输。因此,要分清是数据传输结束还是暂时无数据读取,如果是后者,则读取数据的进程应等待。 虽然管道是一种特殊的文件,它的读写操作和普通文件的读写操作也完全相同,但管道不是一个真实存在的文件,它只在内核中存储,而不存在于文件系统中。 例子: 设计一个程序,要求创建一个管道,复制进程,父进程往管道中写入字符串,子进程从管道中读取并输出字符串。 7.4 命名管道 命名管道又称先入先出队列,是一种特殊的管道,存在于文件系统中。 命名管道一旦创建,就可以像读写普通文件一样进行读写操作。它的使用与管道十分相似但又有自身显著的特点。 命名管道可以用于任何两个进程间的通信,而并不限制这两个进程同源,这是与管道最显著的区别,因此命名管道的使用比管道的使用要灵活得多。 命名管道作为一种特殊的文件存放于文件系统中,而不是像管道一样存放于内核中。当进程对命名管道的使用结束后,命名管道依然存在于文件系统中,除非对其进行删除操作

文档评论(0)

pfenejiarz + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档