实验四、进程通信(二) ——消息通信

实验四、进程通信(二) ——消息通信

ID:38699235

大小:145.00 KB

页数:7页

时间:2019-06-17

实验四、进程通信(二)                       ——消息通信_第1页
实验四、进程通信(二)                       ——消息通信_第2页
实验四、进程通信(二)                       ——消息通信_第3页
实验四、进程通信(二)                       ——消息通信_第4页
实验四、进程通信(二)                       ——消息通信_第5页
资源描述:

《实验四、进程通信(二) ——消息通信》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、操作系统实验报告实验四、进程通信(二)——消息通信一、实验目的1)加深对管道通信的了解2)掌握利用管道进行通信的程序设计3)了解共享内存通信的程序设计方法4)了解和熟悉Linux支持的共享存储区机制二、实验内容任务:(1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用ipcs命令查看系统中消息队列的情况,然后在另一个窗口中运行程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行,再次用ipcs命令观察系统中消息队列的情况。(2)使用系统调用msgget(),msgsnd(),msgrev()及

2、msgctl()编制一长度为1K的消息的发送和接收程序。①为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。②SERVER端建立一个Key为学号末3位的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个消息后显示一句“(server)received”。③CLIENT端使用key为学号末3位的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(clie

3、nt)sent”。④父进程在SERVER和CLIENT均退出后结束。三、代码及运行结果分析(1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用ipcs命令查看系统中消息队列的情况,然后在另一个窗口中运行程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行,再次用ipcs命令观察系统中消息队列的情况先在一个窗口中运行程序1程序1实验代码:#include#include#include#defineMSGKEY208/*在实际

4、实验过程中,为了避免每个同学建立的消息队列关键字一样而相互干扰,关键字请用学号末3位*/structmsgform{longmtype;charmtext[256];}msg;intmsgqid;main(){inti,pid,*pint;externcleanup();for(i=0;i<20;i++)/*软中断处理*/signal(i,cleanup);msgqid=msgget(MSGKEY,0777

5、IPC_CREAT);/*建立与顾客进程相同的消息队列*/for(;;){msgrcv(msgqid,&msg,256,1,0);/*接收来自顾客进程的消息*/pint=(

6、int*)msg.mtext;pid=*pint;printf("server:receivefrompid%d",pid);msg.mtype=pid;*pint=getpid();msgsnd(msgqid,&msg,sizeof(int),0);/*发送应答消息*/}}cleanup(){msgctl(msgqid,IPC_RMID,0);exit();}运行结果:ipcs命令查看在另一个窗口中运行程序2程序2实验代码:#include#include#include#defineMSGKEY208

7、/*在实际实验过程中,为了避免每个同学建立的消息队列关键字一样而相互干扰,关键字请用学号末3位*/structmsgform{longmtype;charmtext[256];};main(){structmsgformmsg;intmsgqid,pid,*pint;msgqid=msgget(MSGKEY,0777);/*建立消息队列*/pid=getpid();pint=(int*)msg.mtext;*pint=pid;msg.mtype=1;/*指定消息类型*/msgsnd(msgqid,&msg,sizeof(int),0);/*往msgqid发送消息msg*/msg

8、rcv(msgqid,&msg,256,pid,0);/*接收来自服务进程的消息*/printf("client:receivefrompid%d",*pint);}运行结果:再次用ipcs命令观察系统中消息队列的情况分析:调用pipe(fd);创建一个管道后,接着调用fork()函数产生两个进程,首先开始执行子进程,关闭管道出口,通过管道入口向管道中写入内容。执行if语句后,进入else语句块内开始父进程,管道入口关闭,通过管道出口端从管道中读取之前写入内容,最后输出出来(2)使用系统

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。