资源描述:
《实验2进程的通信》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验二进程的通信一、内容补充说明实验中用到Unix下pipe管道函数。编程平台基于Windows下Unix编译器Djgpp。Djgpp基于GNUGPL的自由开放的C/C++编译器,许多新的实用的DOS软件都是用它来编译的。可以用它来编写新的DOS软件来使DOS更加强大,而且里面有大量GNUish的DOS软件包。二、分析和设计1.理论分析管道,是指用于连接一个读进程和一个写进程,以实现他们之间信息的共享文件,又称为pipe文件。向管道(共亨文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程
2、(读进程),可以从管道中接受数据。2.总体设计为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力:①互斥:当一个进程正在对pipe进行读/写操作时,另一进程必须等待,程序中使用lockf(fd[IJ,l,0)函数实现对管道的加锁操作,用k)ckf(fd[l],O,O)解除管道的锁定。②同步:当写进程把一定数量的数据写入pipe后,便去睡眠等待,直到读进程取走数据后,再把它唤醍。当读进程试图从一空管道中读取数据时,也应睡眠等待,直至写进程将数据写入管道后,才将其唤醒。③判断对方是否存在:只有确定写进程和读进程都存在的情况下,
3、方能通过管道进行通信。三、详细实现if(pidl=0)/*如果子进程1创建成功,pidl为进程号。*/{lockf(fd[l],l,0);/*锁定管道勺sprintf(OutPipe,"Childprocess1issendingmessage!");/*给Outpipe符值*/write(fd[l],OutPipe,50);/*向管道写入数据*/sleep(5);/*等待读进程读IB数据*/lockf(fdfl],0,0);/*解除管道的锁定*/exit(O);/*结束进程1*/wait(0);/*等待子进程1结束*/re
4、ad(fd[O],InPipe,50);/*从管道中读出数据*/printf(H%su,InPipe);严显示读出的数据*/wait(0);/*等待子进程2结束*/四、操作界面操作界面为命令提示符界面,实验截图如下:1.编译器界面2.编译、连接界面3.运行结果c«CouandProaptStartingDJGPP...ThisisRHIDE1.5.Copyright1996-2003byRobertHohneEditor,,helpsystemandnodificationsbySalvadorEduardoTropeaT
5、hisCUSsnapshotalsocontainsmodificationsbyAndrisPauenisChildprocess1issendingmessage?Childprocess2issendingmessage?MicrosoftWindowsDOSCopyrightMicrosoftCorp1990-2001.C:DJGPP>五、心得体会在网上查阅很多资料,大都是用pipe函数实现。Unix下的pipe函数不能在Windows平台下的VC++编译器编译,GCCfo
6、rWin32有MinGW,Cygwin和Djgpp。其中Djgpp绿色小巧、功能强大,使用方便。六、附录#include#include#include#includeintpidl,pid2;/*定义两个进程变量*/main(){intfd⑵;charOutPipeL1OOJ,InPipe[100];/*定义两个字符数组*/pipe(fd);/*创建管道*/while((pidl=fork())==-1);/*如果进程1创建不成功,则空循环*/if(
7、pidl==0)/*如果子进程1创建成功,pidl为进程号。*/{lockf(fd[l],l,0);严锁定管道勺sprintf(OutPipe,HChildprocess1issendingmessage!M);/*给Outpipe符值*/write(fd[l],OutPipe,50);/*向管道写入数据*/sleep(5);/*等待读进程读出数据*/lockf(fd[l],0,0);严解除管道的锁定*/exit(O);/*结束进程1*/}else{while((pid2=fork())==-1);/*若进程2创建不成功,则
8、空循环勺if(pid2==0){lockf(fd[l]丄0);sprintf(OutPipe,"Childprocess2issendingmessage!");write(fd[1],OutPipe,50);sleep(5)