第四章 进程间通信-管道和信号.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文档。上传文档
查看更多
第四章 进程间通信-管道和信号

第8章 进程间通信-管道和信号 1 2 进程间通信-PIPE 进程间通信―FIFO 3 信号中断处理 FIFO FIFO就是命名管道,或有名管道。它同样是基于VFS,对应的文件类型就是FIFO文件,可以通过mknod命令在磁盘上创建一个FIFO文件。 当进程想通过该FIFO来通信时就可以标准的API open(close、read、write、unlink等)打开该文件,然后开始读写操作。对于FIFO的读写实现,它与pipe是相同的。区别在于,FIFO有open这一操作,而pipe是在调用pipe这个系统调用时直接创建了一对文件描述符用于通信。并且,FIFO的open操作还有些细致的地方要考虑,例如如果写者先打开,尚无读者,那么肯定是不能通信了,所以就需要先去睡眠等待读者打开该FIFO,反之对读者亦然。 * * 用途 FIFO由shell命令使用以便将数据从一条管道线传送到另一条,为此无需创建中间临时文件。 FIFO用于客户进程-服务器进程应用程序中,以在客户进程和服务器进程之间传递数据。 * * 创建FIFO /Create a new FIFO named PATH, with permission bits MODE. */ extern int mkfifo(__comst char * __path, __mode_t __mode) mkfifo()会根据参数建立特殊的有名管道文件,该文件必须不存在,而参数mode为该文件的授权,mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()函数打开FIFO文件时,O_NONBLOCK会有影响。 如果执行成功将返回0,否则返回-1,失败原因存储于errno中。 * * 例:命名管道的使用 #include sys/types.h #include sys/fcntl.h #include fcntl.h #include stdlib.h #include stdio.h #define FIFO /tmp/fifo“ main(){ pid_t pid; char buffer[80]; int fd; unlink(FIFO); mkfifo(FIFO,0744); * * 例:命名管道的使用 if((pid=fork())0) { char s[]=Hello!; fd=open(FIFO,O_WRONLY); printf(this is father write data is %s\n,s); printf(fathers pid is %d\n,getpid()); write(fd,s,sizeof(s)); close(fd); exit(0); } * * 例:命名管道的使用 else if(pid==0) { sleep(2); fd=open(FIFO,O_RDONLY); read(fd,buffer,80); printf(this is child read data is: %s\n,buffer); close(fd); printf(childs pid is %d\n,getpid()); exit(0); }} * * 管道基本特点总结 两类型管道具有以下特点: (1)管道是特殊类型的文件,在满足先入先出的原则条件下可能进行读写,但不能定位读写位置。 (2)管道是单向的,要实现双向,需要两个管道。无名管道只能实现亲缘关系进程间通信(即无名管道的两个文件描述符可以被两者都访问到),而有名管道以磁盘文件的方式存在,可以实现本机任意两进程间通信。 * * 管道基本特点总结(续) (3)无名管道阻塞问题。无名管道无须显式打开,创建时直接返回文件描述符,而在读写时需要确实对方的存在,否则将退出。即如果当前进程向无名管道的一端写数据时,必须确定其另一端为某个进程(这个进程可以是当前进程)拥有。如果写入无名管道的数据超过其最大值,写操作将阻塞,如果管道中没有数据,读操作将阻塞,如果管道发现另一端断开(另一端文件描述符关闭),将自动退出。 * * 管道基本特点总结(续) (4)有名管道阻塞问题。有名管道在打开时需要确实对方的存在,否则将阻塞。即以读方式打开某管道,该操作得以继续执行的条件是:在此之前,已经有一个进程以写的方式打开此管道,否则阻塞,直到条件满足,因此有名管道将阻塞在打开位置。也可以以读写(O_RDWR)方式打开有名管道,进程能够继续执行(不阻塞),即当前进程读,当前进程写。 * * 第8章 进程间通信-管道和信号 1 2 进程间通信-PIPE 进程间通信―FIFO 3 信号中断处理 信号概述 信号是L

文档评论(0)

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

你好,我好,大家好!

版权声明书
用户编号:7140162041000002

1亿VIP精品文档

相关文档