进程间基于消息队列的通信 操作系统实验报告4最新.docVIP

  • 49
  • 0
  • 约3.42万字
  • 约 65页
  • 2018-06-30 发布于辽宁
  • 举报

进程间基于消息队列的通信 操作系统实验报告4最新.doc

内蒙古师大计算机与信息工程学院 《操作系统》课程实验报告 实习题目 实验四 进程间基于消息队列的通信 指导教师 职 称 学生姓名 学 号 日 期 实现工具 C语言 实现环境 Linux系统 实习内容(功能、目标) [实验目的]    系统了解linux系统的通信机构IPC ,掌握IPC中消息通信机制,理解消息通信的方法及特征。 [实验内容]    编写一段程序,同时父进程创建两个子进程p1和p2;并使子进程p1与子进程p2通过消息队列相互发送消息(512字节)。 [实验要求]   (1)掌握系统调用msgget()、msgsnd()、msgrev()、msgctl()的使用方法及其功能,理解消息通信原理;   (2)系统理解linux 的三种通信机制。 实现的思想、方法和技术(含数据结构、算法) 消息机制提供四个系统调用: msgget返回一个消息描述字msgqid,msgqid指定一个消息队列 以便其他三个系统调用使用。 msgsnd和msgrcv分别表示发送和接收一消息。msgsnd(msgqid,msgp,msgsz,msgflg)中的msgqid是msgget返回的消息队列描述符;msgp是用户缓冲区指针;msgsz是消息正文的长度;而msgflg是同步标识,规定msgqid发送消息时是发送完毕后返回还是不等发送立即返回。 系统调用msgrev比msgsnd多一个参数msgtyp,它规定接收消息的类型。msgtyp=0时,表示接收与msgqid相关联的消息队列上的第一个消息;msgtyp0表示接收msgqid相关联的消息队列上的第一个消息;而msgtyp0时,则表示接收小于或等于msgtyp绝对值的最低类型的第一个消息。 msgctl用来设置和返回与msgqid相关联的参数选择项,以及用来删除消息描述符的选择项。 IPC有三个组成部分: 1、消息用于进程之间传递分类的格式化数据。 2、共享存储区方式可使得不同进程通过共享彼此的虚拟空间而达到互相对共享区操作和数据通信的目的。 3、信号量机制用于通信进程之间的同步控制。信号量通常与共享存储器一起使用。 主要代码 注释 #includesys/types.h #includesys/ipc.h #includesys/msg.h #includestdio.h #includestdlib.h #include string.h #define MSGKEY 67 struct msgform { int mtype; char mtext[512]; }; int msgqid; main() { struct msgform msg1,msg2; int p1,p2,pid1,pid2,*pint1,*pint2,i; while((p1=fork())==-1); if(p1==0) { msgqid=msgget(MSGKEY,0777); strcpy(msg1.mtext,Happy!); msg1.mtype=1; msgsnd(msgqid,msg1,512,0); sleep(3); msgrcv(msgqid,msg1,256,7,0); printf(client receive from server %s\n,msg1.mtext); msgctl(msgqid,IPC_RMID,0); exit(0); } else { while((p2=fork())==-1); if(p2==0) { msgqid=msgget(MSGKEY,0777|IPC_CREAT); msgrcv(msgqid,msg2,512,1,0); printf(server receive from client %s\n,msg2.mtext); msg2.mtype=7; strcpy(msg2.mtext,yes); msgsnd(msgqid,msg2,256,0); exit(0); } wait(0); wait(0); } } //以上三行为消息必须有的头文件 //消息的格式 //消息的类型 //消息的正文长度 //建立消息队列,若存在,返回消息描述字//把正文放进去 //指定消息类型 //往msgqid发送消息msg//接收来自服务进程的消息//输出正文的内容 //建立与顾客程序相同的消息队列 //接收来自顾客进程的消息 //放在接收方 /

文档评论(0)

1亿VIP精品文档

相关文档