进程间通信方式——2、消息队列(msg_queue)

原创 2018年04月17日 14:06:57

1.消息队列

消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。 标识符是IPC对象的内部名, 而它的外部名则是key(键), 它的基本类型是key_t, 在头文件<sys/types.h>中定义为长整型.。键由内核变换成标识符。
  用户可以从消息队列中读取数据和添加消息,其中发送进程添加消息到队列的末尾,接收进程在队列的头部接收消息,消息一旦被接收,就会从队列中删除。和FIFO有点类似,但是它可以实现消息的随机查询,比FIFO具有更大的优势(比如按消息的类型字段取消息)。

2.消息队列的三个数据结构

linux内核采用的结构msqid_ds管理消息队列

  1. struct msqid_ds  
  2.   {  
  3.     struct ipc_perm msg_perm;  //消息队列访问权限  
  4.     struct msg *msg_first;    //指向第一个消息的指针  
  5.     struct msg *msg_last;     //指向最后一个消息的指针  
  6.     ulong  msg_cbytes;       //消息队列当前的字节数  
  7.     ulong  msg_qnum;        //消息队列当前的消息个数  
  8.     ulong  msg_qbytes;     //消息队列可容纳的最大字节数  
  9.     pid_t  msg_lsqid;     //最后发送消息的进程号ID  
  10.     pid_t  msg_lrqid;     //最后接收消息的进程号ID  
  11.     time_t msg_stime;     //最后发送消息的时间  
  12.     time_t msg_rtime;     //最后接收消息的时间  
  13.     time_t msg_ctime;    //最近修改消息队列的时间  
  14. };  

linux内核采用的结构msg_queue来描述消息队列

  1. struct msg_queue {  
  2.     structkern_ipc_perm q_perm;  
  3.     time_tq_stime;         /* last msgsndtime */  
  4.     time_tq_rtime;         /* last msgrcvtime */  
  5.     time_tq_ctime;         /* last changetime */  
  6.     unsignedlong q_cbytes;     /* current number of bytes on queue*/  
  7.     unsignedlong q_qnum;       /* number of messages inqueue */  
  8.     unsignedlong q_qbytes;     /* max number of bytes on queue */  
  9.     pid_tq_lspid;          /* pid oflast msgsnd */  
  10.     pid_tq_lrpid;          /* lastreceive pid */  
  11.     structlist_head q_messages;  
  12.     structlist_head q_receivers;  
  13.     structlist_head q_senders;  
  14. };                                                                                                                                                           

syetem V IPC 为每一个IPC结构设置了一个ipc_perm结构,该结构规定了许可权和所有者

  1. struct ipc_perm  
  2. {  
  3.    key_t  key;         //调用shmget()时给出的关键字  
  4.    uid_t  uid;        //共享内存所有者的有效用户ID   
  5.    gid_t  gid;        //共享内存所有者所属组的有效组ID   
  6.    uid_t  cuid;       //共享内存创建 者的有效用户ID  
  7.    gid_t  cgid;      //共享内存创建者所属组的有效组ID  
  8.   unsigned short  mode; //Permissions + SHM_DEST和SHM_LOCKED标志  
  9.   unsignedshort   seq;         //序列号  
  10. };  

3.与消息队列有关的函数

3.1创建打开消息队列






























3.2添加消息



3.3读取消息



3.4获得或修改消息队列或者删除消息队列



4.消息队列读取数据工作模式




附:
进程间通信方式

进程间的通信方式——1、pipe(管道)

https://blog.csdn.net/Windgs_YF/article/details/79973804

进程间通信方式———3、信号量(Semaphore)

https://blog.csdn.net/windgs_yf/article/details/79974049

进程间通信方式——4、共享内存

https://blog.csdn.net/windgs_yf/article/details/79974077




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Windgs_YF/article/details/79974018

进程间通信方式之消息队列

消息队列进行通信的一些操作: 1、使用msgget()函数创建打开队列; 2、使用msgrcv()函数从队列中读数据; 3、使用msgsnd()函数写数据到队列中; 4、使用msgctl()函...
  • Echo_Ana
  • Echo_Ana
  • 2016-10-23 21:56:37
  • 1649

进程间通信方式总结——消息队列

Linux/Unix系统IPC是各种进程间通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和Open Group(X/Open)标准化的推进呵护影响的扩大...
  • tf_apologize
  • tf_apologize
  • 2017-04-16 11:52:25
  • 862

进程间通信:消息队列(代码实现)

消息队列:1.一种从一个进程向另外一个进程发送数据块的方法;                     2.每个数据块都被认为是有一个类型,接受者进程接收的数据块可以有不同的类型值;          ...
  • wangiijing
  • wangiijing
  • 2016-07-05 23:21:15
  • 2345

Linux 高级编程 - 消息队列 Msg Queue

Linux 高级编程 - 消息队列 Msg Queue
  • qq_22075977
  • qq_22075977
  • 2017-09-07 09:06:50
  • 774

Linux进程间通信--信号,管道,消息队列,信号量,共享内存,socket

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面...
  • B_H_L
  • B_H_L
  • 2013-12-03 17:31:29
  • 6735

消息队列程序,进程间通信。

  • 2011年06月01日 09:59
  • 1006B
  • 下载

Linux进程间通信——消息队列应用实例

消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格...
  • li_wen01
  • li_wen01
  • 2017-01-20 17:26:20
  • 618

日积(Running)月累(ZSSURE) :IPC=Inter-Process Communication,进程间通信学习笔记(一)

背景:最近一段时间集中接触了些许关于IPC的相关技术,即进程间通信。网上搜索学习了《Unix网络编程卷2:进程间通信》、ZeroMQ Guide文档、ActiveMQ等资料,对IPC有了大致的了解,本...
  • zssureqh
  • zssureqh
  • 2015-01-15 23:29:26
  • 1651

进程间通信----使用消息队列

面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道 一、什么是消息队列 消息...
  • zhanghuaichao
  • zhanghuaichao
  • 2016-11-20 17:07:16
  • 916

Python基础(八)---进程间通信-Queue

进程之间需要通信,操作系统提供了很多机制来实现进程间的通信 1.multiprocessing模块的QUEUE实现多进程之间的数据传递。Queue本身是一个消息队列程序。 初始化一个Queue对象...
  • tao3741
  • tao3741
  • 2017-08-06 16:52:48
  • 218
收藏助手
不良信息举报
您举报文章:进程间通信方式——2、消息队列(msg_queue)
举报原因:
原因补充:

(最多只允许输入30个字)