- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
注意上图中,管道头和管道尾以及使用正确的文件描述符fd * 注意事项:必须在系统调用fork( )前调用pipe( ),否则子进程将不会继承文件描述符。此时会创建2个管道,并且这两个管道不能进行通信。 * 进程间通信程序设计1 进程间通讯概述 1. 目的(为什么进程间需要通信?) 1)数据传输:一个进程需要将它的数据发送给另一个进程。 2)资源共享:多个进程之间共享同样的资源。 3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。 4)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。 Linux进程间通信(IPC)由以下几部分发展而来:1)UNIX进程间通信2)基于System V进程间通信3)POSIX进程间通信 发展 POSIX(Portable Operating System Interface)表示可移植操作系统接口。电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)最初开发 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。然而,POSIX 并不局限于 UNIX,许多其它的操作系统,例如 DEC OpenVMS 和 Microsoft Windows,都支持 POSIX 标准。 ? System V,也被称为 ATT System V,是Unix操作系统众多版本中的一支。 在Linux使用的进程间通信方式包括:1)管道(pipe)和有名管道(FIFO)2)信号(signal)3)消息队列4)共享内存5)信号量6)套接字(socket) 分类 管道 管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。 数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。 管道创建 管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。 无名管道由pipe()函数创建: int pipe(int filedis[2]);当一个管道建立时,它会创建两个文件描述符:filedis[0] 用于读管道, filedis[1] 用于写管道,如图所示: 管道关闭 关闭管道只需将这两个文件描述符关闭即可,可以使用普通的close函数逐个关闭 #include unistd.h #include errno.h #include stdio.h #include stdlib.h int main() { int pipe_fd[2]; if(pipe(pipe_fd)0) { printf(pipe create error\n); return -1; } else? printf(pipe create success\n); close(pipe_fd[0]); close(pipe_fd[1]); } 管道读写 管道用于不同进程间通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道 pipe_rw.c 程序演示 memset的原型:void memset(void *s, int ch, unsigned n); 功能是将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作。 命名管道(FIFO) 命名管道和无名管道基本相同,但也有不同点:无名管道只能由父子进程使用;但是通过命名管道,不相关的进程也能交换数据。 #include sys/types.h#include sys/stat.hint mkfifo(const char * pathname, mode_t mode)vpathname:FIFO文件名vmode:属性(见文件操作章节)一旦创建了一个FIFO,就可用open打开它,一般的文件访问函数(close、read、write等)都可用于FIFO。 当使用open()函数打开FIFO时,非阻塞标志(O_NONBLOC
文档评论(0)