操作系统实验,实验8 消息队列.ppt

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验,实验8 消息队列

实验八 消息队列 实验目的 加深对进程概念的理解,明确进程和程序的区别、进一步认识并发执行的实质 了解并熟悉Linux系统中利用消息队列实现进程通信的基本概念及方法 熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数 实验准备及预习 阅读讲义《附件9-消息队列》,了解Linux系统中利用消息队列实现进程通信的基本概念及方法 熟悉Linux提供的有关系统调用函数/库函数:msgget()、msgsnd()、msgrcv()、msgctl() 基本概念 消息队列提供了一种在两个进程之间传递数据的简单且有效的方法 与命名管道相比,它独立于发送/接收进程而存在,消除了同步命名管道打开/关闭时可能产生的一些困难 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法;每个数据块都有一个类型标识,接收进程可独立地接收不同类型的数据块 消息队列存在于系统内核中,每个消息队列的容量(所能容纳的字节数)都有限制,该值因系统不同而不同 消息队列的创建 #includesys/msg.h int msgget(key_t key,int msgflg); 功能:创建一个消息队列或取得一个已经存在的消息队列 返回值:成功返回消息队列的标示符(ID),失败为-1 参数: key:消息队列的键值,为IPC_PRIVATE时将创建一个只能被创建进程读写的消息队列;若不是IPC_PRIVATE,则可指定某个整数值,还可以用ftok ()函数来获得一个唯一的键值 msgflg:创建消息队列的创建方式或权限: IPC_CREAT,如果内存中不存在指定消息队列,则创建一个消息队列,否则取得该消息队列 例1:使用函数msgget()创建一个消息队列 #includestdio.h #includestdlib.h #includesys/msg.h #define MYMSG_KEY 75 int main() { int msgid; msgid=msgget(MYMSG_KEY,IPC_CREAT | 0644); printf(msgid=%d\n,msgid); if(msgid==-1){ perror(msgget error :); exit(EXIT_FAILURE); } return 0; } 可用ipcs -q 来查看是否创建成功 用ipcrm –q msgid删除指定消息队列 发送消息 #includesys/msg.h int msgsnd(int msgid,struct msgbuf *msgp ,int msgsz, int msgflg); 功能:往队列中发送一个消息 返回值:成功返回0,失败返回-1 参数: msgid:消息标识id,也就是msgget()函数的返回值 msgp:指向消息缓冲区的指针,该结构体为 struct mymesg { long mtype; /*消息类型*/ char mtext[512]; /*消息文本*/ } msgsz:消息文本的大小,不包含消息类型(4个字节) msgflg:可以设置为0,或者IPC_NOWAIT。为0,调用进程会被挂起,直到消息写到消息队列为止 // write messages to msg queue msg_send.mtype=1; printf(enter a message:\n); scanf(“%s”,buf); // 输入字符串不能包含空格 strcpy(msg_send.mtext,buf); ret=msgsnd(msgid,msg_send,strlen(msg_send.mtext)+1,0); if(ret==-1){ perror(msgget error: ); exit(EXIT_FAILURE); } return 0; } 运行程序两次,写入2个消息 读消息 #includesys/msg.h int msgrcv(int msgid , struct msgbuf *msgp,int msgsz , long mtype,int msgflg ); 功能:从消息队列中读走消息 返回值:成功返回0,失败返回-1 参数: msgid:消息队列的id号 msgp:存储读取到的消息的地址 msgsz:消息的长度,不包含mtype mtype :从消息队列中读取的消息的类型,为0则会读取写入队列的第一条消息 msgflg:为0时表示该进程将一直阻塞,直到有消息可读 运行结果(执行两次,把前一个程序运行时写入消息队列的两个消息都读出来) 消息队列处理 #includesys/msg.h int msgctl(int msgid,

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档