实验四、进程通信(二) ——消息通信.doc_第1页
实验四、进程通信(二) ——消息通信.doc_第2页
实验四、进程通信(二) ——消息通信.doc_第3页
实验四、进程通信(二) ——消息通信.doc_第4页
实验四、进程通信(二) ——消息通信.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统实验报告实验四、进程通信(二) 消息通信一、 实验目的1) 加深对管道通信的了解2) 掌握利用管道进行通信的程序设计3) 了解共享内存通信的程序设计方法4) 了解和熟悉Linux支持的共享存储区机制二、 实验内容任务:(1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用ipcs命令查看系统中消息队列的情况,然后在另一个窗口中运行程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行,再次用ipcs命令观察系统中消息队列的情况。(2)使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1K的消息的发送和接收程序。为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。SERVER端建立一个Key为学号末3位的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个消息后显示一句“(server)received”。CLIENT端使用key为学号末3位的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client)sent”。父进程在SERVER和CLIENT均退出后结束。三、 代码及运行结果分析(1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用ipcs命令查看系统中消息队列的情况,然后在另一个窗口中运行程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行,再次用ipcs命令观察系统中消息队列的情况先在一个窗口中运行程序1程序1实验代码:#include #include #include #define MSGKEY 208 /*在实际实验过程中,为了避免每个同学建立的消息队列关键字一样而相互干扰,关键字请用学号末3位*/struct msgform long mtype; char mtext 256; msg;int msgqid;main () int i ,pid, *pint; extern cleanup(); for (i=0;i20;i+)/*软中断处理*/ signal (i,cleanup); msgqid = msgget (MSGKEY,0777|IPC_CREAT);/*建立与顾客进程相同的消息队列*/for (;) msgrcv (msgqid ,&msg,256,1,0);/*接收来自顾客进程的消息*/ pint=(int * ) msg. mtext; pid = * pint; printf (server:receive from pid %dn,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 #define MSGKEY 208 /*在实际实验过程中,为了避免每个同学建立的消息队列关键字一样而相互干扰,关键字请用学号末3位*/struct msgform long mtype; char mtext 256;main()struct msgform msg;int msgqid,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*/msgrcv(msgqid,&msg,256,pid,0);/*接收来自服务进程的消息*/printf(client : receive from pid%dn,*pint);运行结果:再次用ipcs命令观察系统中消息队列的情况分析:调用pipe(fd);创建一个管道后,接着调用fork()函数产生两个进程,首先开始执行子进程,关闭管道出口,通过管道入口向管道中写入内容。执行if语句后,进入else语句块内开始父进程,管道入口关闭,通过管道出口端从管道中读取之前写入内容,最后输出出来(2)使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1K的消息的发送和接收程序。为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。SERVER端建立一个Key为学号末3位的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个消息后显示一句“(server)received”。CLIENT端使用key为学号末3位的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client)sent”。父进程在SERVER和CLIENT均退出后结束。实验代码:#include#include#include#include#define MSGKEY 201struct msgformlong mtype;char mtext1030;msg;int msgqid,i;void CLIENT()int i;msgqid=msgget(MSGKEY,0777);for(i=10;i=1;i-)msg.mtype=i;printf(client)sentn);msgsnd(msgqid,&msg,1024,0);exit(0);void SERVER()msgqid=msgget(MSGKEY,0777|IPC_CREAT);domsgrcv(msgqid,&msg,1030,0,0);printf(server)receivedn);while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);exit(0);int main()while(i=fork()=-1);if(!i)SERVER();while(i=fork()=-1);if(!i)CLIENT();wait(0);wait(0);运行结果:分析:msgflg低9位类似于文件访问权限的低9位,其他位指明消息队列的建立方式:若指定的关键字消息队列不存在,msgflg&IPC_CREAT为真,则为他建立一个新的消息队列; msgflg&IPC_CREAT为假,返回-1。若指定的关键字消息队列存在,则返回该消息队列的描述符。若msgflg&IPC_CREAT&IPC_EXCL为真,若指定的关键字消息队列不存在,失败返回-1;否则正常返回。若key等于IPC_PRIVATE,则msgget调用总是成功的。 根据控制命令cmd对msqid消息队列进行相应的控制。参数buf是指向用户程序地址空间中一个msqid_ds结构的指针,以便将相关控制信息在核心和用户地址空间之间进行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论