资源描述:
《实验2操作系统.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、计算机科学系实验报告(首页)课程名称操作系统实验名称进程通信一、实验目的(1)理解用管道方式实现进程通信(2)理解用共享存储区方式实现进程通信二、实验设备与环境PC机,windowsXP操作系统,LinuxVirtualMachine运行环境。三、实验内容、程序清单及运行结果实验内容:任务1:并发进程间通过管道实现数据实时传送所谓管道,是指能够连接写进程和读进程的、并允许它们以生产者----消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端将数据写入管道,而读进程则从管道的读出端读出数据。管道分有名管道和无名管道。无名管道是利用系统调用pipe()建立起
2、来的一个无名的临时文件,只能用该系统调用所返回的文件描述符来识别该文件,因此只有创建管道的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。任务2:并发进程间通过共享存储区实现数据传送代码说明:用主程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,让它们利用共享存储区的方式进行通信:接收端SERVER:获取(如果还没有就创建)一个KEY为75的共享存储区,并将第一个字节置为-1,作为数据空的标志,等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息。SERVER取得该数据,进行处理,然后将处理结果显示出来,再显示一句“(ser
3、ver)received”。发送端CLIENT:获取一个KEY为75的共享区,当共享区第一个字节的值为-1时,表示SERVER端空闲。这时CLIENT向共享区中填入要发送的数据,同时显示自己发送的数据,然后再显示一句“(client)send”。发送和接收的过程循环进行30次。父进程在SERVER和CLIENT均退出后结束。在以下程序中,每个函数只关注一个进程包含的程序段。四、实验结论、思考题回答思考题:1程序中的sleep(5)起什么作用?挂起进程,等待数据输入完毕。2管道是父进程创建的,子进程1和2为什么也能对管道进行操作?所谓管道,是指能够连接写进程和读进程的、并允许它们以
4、生产者----消费者方式进行通信的一个共享文件,所以,子进程也可以进行操作。3、长度为1024B的共享存储区,在每次通信时被使用了多少?如果每次想多传几个字节,程序该如何改写?(实验报告上给出改写后的源码,并在机器上运行,观察并记录运行结果。)发送一个int类型,大小为4B。#include#include#defineSHMKEY75#includeintshmid,i,j,p1,p2;int*addr;voidSERVER()/*接收进程*/{intj;shmid=shmget(SHMKEY,1024,0777
5、I
6、PC_CREAT);/*创建共享存储区*/addr=shmat(shmid,0,0);/*将共享存储区附接到本进程的数据区*/do{*addr=-1;while(*addr==-1);/*非让权等待,等待信息传来*///i=*addr;/*从共享存储区读数据*///printf("%d",i+100);/*加工该数据*/for(j=0;j<5;j++)printf("%d",*(addr+j));printf("(server)received");}while(*addr);shmctl(shmid,IPC_RMID,0);/*撤消共享存储区,归还资源*/exit(0)
7、;}voidCLIENT()/*发送过程*/{intj,a[5]={1,2,3,4,5};shmid=shmget(SHMKEY,1024,0777);/*打开共享存储区*/addr=shmat(shmid,0,0);/*将共享存储区附接到本进程的数据区*/for(j=29;j>=0;j--){while(*addr!=-1);/*非让权等待,等待共享存储区空闲*///*addr=j;/*往共享存储区中写数据*/*addr=a;printf("%d",j);printf("(client)sent");}exit(0);}main(){while((p1=fork())==-
8、1);/*父进程*/if(p1==0)SERVER();/*子进程p1*/while((p2=fork())==-1);/*父进程*/if(p2==0)CLIENT();/*子进程p2*/wait(0);/*父进程*/wait(0);/*父进程*/}