网站大量收购闲置独家精品文档,联系QQ:2885784924

实验报告四完整版.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE 1 PAGE 电子科技大学信息与软件工程学院 标 准 实 验 报 告 (实验)课程名称:计算机操作系统 电子科技大学教务处制表 电 子 科 技 大 学 实 验 报 告 学生姓名:李璕 学 号:2012224020005 一、实验室名称:信息与软件工程学院通用计算机软件实验室 二、实验项目名称:利用消息队列实现进程间的通信 三、实验原理: 消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。 相关函数说明: 消息队列 C语言结构 msgget(创建和访问一个消息队列) msgsend(把消息添加到消息队列中) msgrcv(从一个消息队列获取消息) msgctl(控制消息队列) 对消息队列的操作无非有下面三种类型: 1、 打开或创建消息队列 消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可; 注:消息队列描述字是由在系统范围内唯一的键值生成的,而键值可以看作对应系统内的一条路经。 2、 读写操作 消息读写操作非常简单,对开发人员来说,每个消息都类似如下的数据结构: struct msgbuf{ long mtype; char mtext[1]; }; mtype成员代表消息类型,从消息队列中读取消息的一个重要依据就是消息的类型;mtext是消息内容,当然长度不一定为1。因此,对于发送消息来说,首先预置一个msgbuf缓冲区并写入消息类型和内容,调用相应的发送函数即可;对读取消息来说,首先分配这样一个msgbuf缓冲区,然后把消息读入该缓冲区即可。 3、 获得或设置消息队列属性: 消息队列的信息基本上都保存在消息队列头中,因此,可以分配一个类似于消息队列头的结构(struct msqid_ds),来返回消息队列的属性;同样可以设置该数据结构。 4.系统V消息队列API:系统V消息队列API共有四个,使用时需要包括几个头文件: #include sys/types.h #include sys/ipc.h #include sys/msg.h 1)int msgget(key_t key, int msgflg) 参数key是一个键值;msgflg参数是一些标志位。该调用返回与健值key相对应的消息队列描述字。 在以下两种情况下,该调用将创建一个新的消息队列: 如果没有消息队列与键值key相对应,并且msgflg中包含了IPC_CREAT标志位; key参数为IPC_PRIVATE; 参数msgflg可以为以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或结果。 调用返回:成功返回消息队列描述字,否则返回-1。 注:参数key设置成常数IPC_PRIVATE并不意味着其他进程不能访问该消息队列,只意味着即将创建新的消息队列。 2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg); 该系统调用从msgid代表的消息队列中读取一个消息,并把消息存储在msgp指向的msgbuf结构中。 msqid为消息队列描述字;消息返回后存储在msgp指向的地址,msgsz指定msgbuf的mtext成员的长度(即消息内容的长度),msgtyp为请求读取的消息类型;读消息标志msgflg可以为以下几个常值: IPC_NOWAIT 如果没有满足条件的消息,调用立即返回,此时,errno=ENOMSG IPC_EXCEPT 与msgtyp0配合使用,返回队列中第一个类型不为msgtyp的消息 IPC_NOERROR 如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。 msgrcv手册中详细给出了消息类型取不同值时(0; 0; =0),调用将返回消息队列中的哪个消息。 msgrcv()解除阻塞的条件有三个: 消息队列中有了满足条件的消息; msqid代表的消息队列被删除; 调用msgrcv()的进程被信号中断; 调用返回:成功返回读出消息的实际字节数,否则返回-1。 3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg); 向msgid代表的消息队列发送一个消息,即将发送的消息存储在msgp指向的msgbuf结构中,消息的大小由msgze指定。 对发送消息来说,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间

文档评论(0)

姚启明 + 关注
实名认证
内容提供者

80后

1亿VIP精品文档

相关文档