2022年2022年进程通信之消息队列 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年2022年进程通信之消息队列 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年进程通信之消息队列 .pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、进程间通信之消息队列消息队列现在我们来讨论第三种也是最后一种System V IPV 工具:消息队列。在许多方面看来,消息队列类似于有名管道,但是却没有与打开与关闭管道的复杂关联。然而,使用消息队列并没有解决我们使用有名管道所遇到的问题,例如管道上的阻塞。消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法。与有名管道比较起来,消息队列的优点在独立于发送与接收进程,这减少了在打开与关闭有名管道之间同步的困难。消息队列提供了一种由一个进程向另一个进程发送块数据的方法。另外,每一个数据块被看作有一个类型,而接收进程可以独立接收具有不同类型的数据块。消息队列的好处在于我们几乎可以完全避免
2、同步问题,并且可以通过发送消息屏蔽有名管道的问题。更好的是,我们可以使用某些紧急方式发送消息。坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限制,同时在系统中所有消息队列上的块尺寸上也有一个最大尺寸限制。尽管有这些限制,但是X/Open 规范并没有定义这些限制的具体值,除了指出超过这些尺寸是某些消息队列功能失败的原因。Linux 系统有两个定义,MSGMAX与 MSGMNB,这分别定义单个消息与一个队列的最大尺寸。这些宏定义在其他系统上也许并不相同,甚至也许就不存在。消息队列函数定义如下:#include int msgctl(int msqid,int cmd,struct msqid
3、_ds*buf);int msgget(key_t key,int msgflg);int msgrcv(int msqid,void*msg_ptr,size_t msg_sz,long int msgtype,int msgflg);int msgsnd(int msqid,const void*msg_ptr,size_t msg_sz,int msgflg);与信息号和共享内存一样,头文件sys/types.h与 sys/ipc.h 通常也是需要的。Msgget()我们可以使用msgget函数创建与访问一个消息队列:int msgget(key_t key,int msgflg);与其
4、他IPC 工具类似,程序必须提供一个指定一个特定消息队列的key 值。特殊值IPC_PRIV ATE 创建一个私有队列,这在理论上只可以为当前进程所访问。与信息量和共享内存一样,在某些Linux 系统上,消息队列并不是私有的。因为私有队列用处较少,因而这并不是一个严重问题。与前面一样,第二个参数,msgflg,由 9 个权限标记组成。要创建一个新的消息队列,由 IPC_CREAT 特殊位必须与其他的权限位进行或操作。设置 IPC_CREAT标记与指定一个已存在的消息队列并不是错误。如果消息队列已经存在,IPC_CREAT 标记只是简单的被忽略。如果成功,msgget 函数会返回一个正数作为队列
5、标识符,如果失败则会返回-1。Msgsnd()名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 6 页 -msgsnd函数允许我们将消息添加到消息队列:int msgsnd(int msqid,const void*msg_ptr,size_t msg_sz,int msgflg);消息结构由两种方式来限定。第一,他必须小于系统限制,第二,必须以 long int 开始,这在接收函数中会用作一个消息类型。当我们在使用消息时,最好是以如下形式来定义我们的消息结构:struct my_message long int message_type;/*The data you wish t
6、o transfer*/因为 message_type 用于消息接收,所以我们不能简单的忽略他。我们必须定义我们自己的数据结构来包含并对其进行初始化,从而他可以包含一个可知的值。第一个参数,msgid,是由 msgget函数所返回的消息队列标识符。第二个参数,msg_ptr,是一个指向要发送消息的指针,正如前面所描述的,这个消息必须以 long int 类型开始。第三个参数,msg_sz,是由 msg_ptr 所指向的消息的尺寸。这个尺寸必须不包含long int 消息类型。第四个参数,msgflg,控制如果当前消息队列已满或是达到了队列消息的系统限制时如何处理。如果msgflg 标记设置了I
7、PC_NOWAIT,函数就会立即返回而不发送消息,并且返回值为-1。如果 msgflg 标记清除了IPC_NOWAIT 标记,发送进程就会被挂起,等待队列中有可用的空间。如果成功,函数会返回0,如果失败,则会返回-1。如果调用成功,系统就会复杂一份消息数据并将其放入消息队列中。Msgrcv()msgrcv 函数由一个消息队列中收取消息:int msgrcv(int msqid,void*msg_ptr,size_t msg_sz,long int msgtype,int msgflg);第一个参数,msqid,是由 msgget函数所返回的消息队列标记符。第二个参数,msg_ptr,是一个指向
8、将要接收消息的指针,正如在msgsnd 函数中所描述的,这个消息必须以long int 类型开始。第三个参数,msg_sz,是由 msg_ptr 所指向的消息的尺寸,并不包含long int 消息类型。第四个参数,msgtype,是一个 long int 类型,允许一个接收优先级形式的实现。如果 msgtype的值为 0,队列中第一个可用的消息就会被接收。如果其值大于0,具有相同消息类型的第一个消息就会被接收。如果其值小于0,第一个具有相同类型或是小于msgtype 绝对值的消息就会被接收。这听起来要比实际操作复杂得多。如果我们只是简单的希望以其发送的顺序来接收消息,我们可以将msgtype
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年进程通信之消息队列 2022 进程 通信 消息 队列
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内