- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验,实验7 管道通信
实验七 管道通信 实验目的 加深对进程概念的理解,明确进程和程序的区别、进一步认识并发执行的实质 了解并熟悉Linux系统中利用管道实现进程通信的基本概念及方法 熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数 实验准备及预习 阅读讲义《附件8-管道通信》,了解Linux系统中利用管道实现进程通信的基本概念及方法 熟悉Linux提供的有关系统调用函数/库函数:pipe()、mkfifo、close()、read()、write()、lockf() 管道是Linux支持的最初Unix IPC形式之一,也是一种使用非常频繁的通信机制 逻辑上被看作管道文件,只存在于内存中 管道是单向的、先进先出的、无结构的、固定大小的字节流,把一个进程的标准输出和另一个进程的标准输入连接在一起 写进程在管道的尾端写入数据,读进程在管道的首端读出数据 数据读出后将从管道中移走,其它读进程都不能再读到这些数据 管道提供了简单的流控制机制 进程试图读空管道时,在有数据写入管道前,进程将一直阻塞 管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞 管道克服使用文件通信的两个问题 限制管道的大小 管道是一个固定大小的缓冲区 Linux中,该缓冲区的大小为1页,即4K字节,因此不像文件那样不加检验地增长 写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写 读取进程可能工作得比写进程快 当所有当前进程数据已被读取时,管道变空 随后的read()调用将默认地被阻塞,等待某些数据被写入 例1:管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比如,当在某个shell程序(Bourneshell或C shell等)键入who│wc -l后,相应shell程序将创建who以及wc两个进程和这两个进程间的管道。考虑下面的命令行: $kill -l 显示当前系统支持的所有信号 $kill -l | grep SIGRTMIN 管道的创建 #include unistd.h int pipe(int fd[2]) 功能:创建一个管道,管道两端可分别用描述字fd[0]以及fd[1]来描述 注意 管道的两端是固定任务的,一端只能用于读,由描述字fd[0]表示,称为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称为管道写端 如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生 一般文件的I/O函数都可以用于管道,如close、read、write等等 例2:使用系统调用pipe()建立一条管道线,两个子进程p1和p2分别向管道各写一句话:child1 is sending a message!和child2 is sending a message!,父进程则从管道中读出来自子进程的信息,并显示在屏幕上。 #include unistd.h #include stdio.h main() { int fd[2]; int pid1,pid2; char OutPipe[100], InPipe[100]; pipe(fd); while((pid1=fork())==-1); if(pid1==0){ printf(“child process1 %d\n”,getpid()); lockf(fd[1],1,0); /*加锁锁定写入端*/ sprintf(OutPipe, “child1 is sending a message!”); write(fd[1], OutPipe, 50);/*将buf中的50个字符写入管道*/ sleep(5); /*睡眠5秒,暂时放弃CPU*/ lockf(fd[1],0,0); /*解锁释放写入端*/ exit(0); /*结束进程pid1 */ } else{// else if pid1 while((pid2=fork())==-1); if(pid2==0){ printf(“child process2 %d\n”,getpid()”); lockf(fd[1],1,0); sprintf(OutPipe, “child2 is sending a message!”); write(fd[1], OutPipe, 50); sleep(5); lockf(fd[1],0,0); exit(0); } }else{ /*else if pid2*/ printf(“parent process %d\n”,getpid())
您可能关注的文档
最近下载
- 小学体育_队列队形教学设计学情分析教材分析课后反思.doc
- 中建项目商务策划汇报模板.pptx
- 公路中小跨径钢-混组合梁桥标准图集(制订)》技术方案报告.docx
- “设计思维与方法”教案.ppt
- 大职赛生涯闯关参考答案.docx VIP
- 2022《美宜佳公司营运资金管理存在的问题及对策研究》开题报告文献综述(含提纲)3200字.docx VIP
- 长垣市人民医院西学中培训班《方剂学》考试.pdf VIP
- 苏教版一年级科学上册4.1《自然物与人造物》(课件).pptx
- 电子商务招聘简章模板.pdf
- 统编版小学语文二年级上册第六单元 先辈伟人 大单元整体学历案教案 教学设计附作业设计(基于新课标教学评一致性).docx
文档评论(0)