版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验四进程间通信(三)消息的发送与接受实验实验目的:理解什么是消息。熟悉消息传送机理。编程实现消息的发送与接受。预习内容:实验内容:消息的创立、发送和接受。使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制一长度为1k的消息发送和接受的程序。<参考程序>1、client.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidclient(){inti;msgqid=msgget(MSGKEY,0777);/*打开75#消息队列*/for(i=10;i>=1;i--){msg.mtype=i;printf(“(client)sent\n”);msgsnd(msgqid,&msg,1024,0);/*发送消息*/}exit(0);}main(){client();}2、server.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidserver(){msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*创立75#消息队列*/do{msgrcv(msgqid,&msg,1030,0,0);/*接受消息*/printf(“(server)received\n”);}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*删除消息队列,偿还资源*/exit(0);}main(){server();}程序阐明:1、为了便于操作和观察成果,编制二个程序client.c和server.c,分别用于消息的发送与接受。2、server建立一种Key为75的消息队列,等待其它进程发来的消息。当碰到类型为1的消息,则作为结束信号,取消该队列,并退出server。server每接受到一种消息后显示一句“(server)received。”3、client使用key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后一种消息,即是server端需要的结束信号。client每发送一条消息后显示一句“(client)sent”。4、注意:二个程序分别编辑、编译为client与server。执行:./server&ipcs-q./client。实验阐明:一、什么是消息消息(message)是一种格式化的可变长的信息单元。消息机制允许由一种进程给其它任意的进程发送一种消息。当一种进程收到多个消息时,可将它们排成一种消息队列。消息使用二种重要的数据构造:一是消息首部,其中统计了某些与消息有关的信息,如消息数据的字节数;二是消息队列头表,其每一表项是作为一种消息队列的消息头,统计了消息队列的有关信息。1、消息机制的数据构造(1)消息首部统计某些与消息有关的信息,如消息的类型、大小、指向消息数据区的指针、消息队列的链接指针等。(2)消息队列头表其每一项作为一种消息队列的消息头,统计了消息队列的有关信息如指向消息队列中第一种消息和指向最后一种消息的指针、队列中消息的数目、队列中消息数据的总字节数、队列所允许消息数据的最大字节总数,尚有近来一次执行发送操作的进程标记符和时间、近来一次执行接受操作的进程标记符和时间等。2、消息队列的描述符UNIX中,每一种消息队列都有一种称为核心字(key)的名字,是由顾客指定的;消息队列有一消息队列描述符,其作用与顾客文献描述符同样,也是为了方便顾客和系统对消息队列的访问。二、涉及的系统调用1.msgget()创立一种消息,获得一种消息的描述符。核心将搜索消息队列头表,拟定与否有指定名字的消息队列。若无,核心将分派一新的消息队列头,并对它进行初始化,然后给顾客返回一种消息队列描述符,否则它只是检查消息队列的许可权便返回。系统调用格式:msgqid=msgget(key,flag)该函数使用头文献以下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>参数定义intmsgget(key,flag)key_tkey;intflag;其中:key是顾客指定的消息队列的名字;flag是顾客设立的标志和访问方式。如IPC_CREAT|0400与否该队列已被创立。无则创立,是则打开;IPC_EXCL|0400与否该队列的创立应是互斥的。msgqid是该系统调用返回的描述符,失败则返回-1。2.msgsnd()发送一消息。向指定的消息队列发送一种消息,并将该消息链接到该消息队列的尾部。系统调用格式:msgsnd(msgqid,msgp,size,flag)该函数使用头文献以下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>参数定义:intmsgsnd(msgqid,msgp,size,flag)intmsgqid,size,flag;structmsgbuf*msgp;其中msgqid是返回消息队列的描述符;msgp是指向顾客消息缓冲区的一种构造体指针。缓冲区中涉及消息类型和消息正文,即{longmtype;/*消息类型*/charmtext[];/*消息的文本*/}size批示由msgp指向的数据构造中字符数组的长度;即消息的长度。这个数组的最大值由MSG-MAX()系统可调用参数来拟定。flag规定当核心用尽内部缓冲空间时应执行的动作:进程是等待,还是立刻返回。若在标志flag中未设立IPC_NOWAIT位,则当该消息队列中的字节数超出最大值时,或系统范畴的消息数超出某一最大值时,调用msgsnd进程睡眠。若是设立IPC_NOWAIT,则在此状况下,msgsnd立刻返回。对于msgsnd(),核心须完毕下列工作:(1)对消息队列的描述符和许可权及消息长度等进行检查。若正当才继续执行,否则返回;(2)核心为消息分派消息数据区。将顾客消息缓冲区中的消息正文,拷贝到消息数据区;(3)分派消息首部,并将它链入消息队列的末尾。在消息首部中须填写消息类型、消息大小和指向消息数据区的指针等数据;(4)修改消息队列头中的数据,如队列中的消息数、字节总数等。最后,唤醒等待消息的进程。3.msgrcv()接受一消息。从指定的消息队列中接受指定类型的消息。系统调用格式:msgrcv(msgqid,msgp,size,type,flag)本函数使用的头文献以下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>参数定义:intmsgrcv(msgqid,msgp,size,type,flag)intmsgqid,size,flag;structmsgbuf*msgp;longtype;其中,msgqid,msgp,size,flag与msgsnd中的对应参数相似,type是规定要读的消息类型,flag规定倘若该队列无消息,核心应做的操作。如此时设立了IPC_NOWAIT标志,则立刻返回,若在flag中设立了MS_NOERROR,且所接受的消息不不大于size,则核心截断所接受的消息。对于msgrcv系统调用,核心须完毕下述工作:(1)对消息队列的描述符和许可权等进行检查。若正当,就往下执行;否则返回;(2)根据type的不同分成三种状况解决:type=0,接受该队列的第一种消息,并将它返回给调用者;type为正整数,接受类型type的第一种消息;type为负整数,接受不大于等于type绝对值的最低类型的第一种消息。(3)当所返回消息大小等于或不大于顾客的请求时,核心便将消息正文拷贝到顾客区,并从消息队列中删除此消息,然后唤醒睡眠的发送进程。但如果消息长度比顾客规定的大时,则做出错返回。4.msgctl()消息队列的操纵。读取消息队列的状态信息并进行修改,如查询消息队列描述符、修改它的许可权及删除该队列等。系统调用格式:msgctl(msgqid,cmd,buf);本函数使用的头文献以下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>参数定义:intmsgctl(msgqid,cmd,buf);intmsgqid,cmd;structmsgqid_ds*buf;其中,函数调用成功时返回0,不成功则返回-1。buf是顾客缓冲区地址,供顾客寄存控制参数和查询成果;cmd是规定的命令。命令可分三类:(1)IPC_STAT。查询有关消息队列状况的命令。如查询队列中的消息数目、队列中的最大字节数、最后一种发送消息的进程标记符、发送时间等;(2)IPC_SET。按buf指向的构造中的值,设立和变化有关消息队列属性的命令。如变化消息队列的顾客标记符、消息队列的许可权等;(3)IPC_RMID。消除消息队列的标记符。msgqid_ds构造定义以下:structmsgqid_ds{structipc_permmsg_perm;/*许可权构造*/shortpad1[7];/*由系统使用*/ushortmsg_qnum;/*队列上消息数*/ushortmsg_qbytes;/*队列上最大字节数*/ushortmsg_lspid;/*最后发送消息的PID*/ushortmsg_lrpid;/*最后接受消息的PID*/time_tmsg_stime;/*最后发送消息的时间*/time_tmsg_rtime;/*最后接受消息的时间*/time_tmsg_ctime;/*最后更改时间*/};structipc_perm{ushortuid;/*现在顾客*/ushortgid;/*目迈进程组*/us
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年公务员法宣模拟试卷(含答案)
- 2026年国考考试模拟试卷(含答案)
- 2026年杜甫绝句(两个黄鹂鸣翠柳)模拟试题(含答案)
- 民法典知识测试题及答案详解
- 稀土储氢材料工岗前工作能力考核试卷含答案
- 2026年apqp模拟试题(含答案)
- 2026年纺织行业模拟试卷(含答案)
- 2026年中级会计职称考试重点难点解析模拟试卷(含答案)
- 2026年电气测试模拟试题(含答案)
- 2026年劳务工培训考试模拟题及答案详解
- GB/T 22187-2026建立人体测量数据库的一般要求
- 缺氧护理中的护理实践与案例分析
- 违纪违规处理课件
- 农产品加工质量管理体系建设
- J08J110 居住建筑节能构造(DBJT02-53-2008)
- 2025贵州茅台酒厂集团招聘管理人员13人笔试历年备考题库附带答案详解试卷2套
- TSGT5002-2025电梯维护保养规则
- z08海员基本安全培训题库及答案解析
- 《汉江临泛》课件
- 摩托置换合同协议书模板
- 浦东新区2024-2025学年六年级上学期期中考试数学试卷及答案(上海新教材)
评论
0/150
提交评论