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

1.消息队列

消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。 标识符是IPC对象的内部名, 而它的外部名则是key(键), 它的基本类型是key_t, 在头文件<sys/types.h>中定义为长整型.。键由内核变换成标识符。

  用户可以从消息队列中读取数据和添加消息,其中发送进程添加消息到队列的末尾,接收进程在队列的头部接收消息,消息一旦被接收,就会从队列中删除。和FIFO有点类似,但是它可以实现消息的随机查询,比FIFO具有更大的优势(比如按消息的类型字段取消息)。

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

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

[cpp] view plain copy

  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来描述消息队列

[cpp] view plain copy

  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结构,该结构规定了许可权和所有者

[cpp] view plain copy

  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

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很高兴为您解答这个问题。消息队列是一种常用的进程间通信方式。它可以使不同进程之间通过消息传递来通信。递归实现进程间通信的原理是,在消息队列内部将消息作为一个树形结构进行组织,每个节点代表一条消息,每个节点中包含消息、发送方进程ID、接收方进程ID等信息。这样,当一个进程发送消息时,消息将通过递归方式到达消息队列尾部,并被追加到树形结构的最底层;当一个进程接收消息时,它将从头部开始遍历这个树形结构,寻找合适的消息。下面是一个简单的消息队列递归实现进程间通信的demo,可以供您参考: ```python import queue class MsgNode: def __init__(self, msg, sender, receiver): self.msg = msg self.sender = sender self.receiver = receiver self.children = [] def send_msg(msg, sender, receiver, msg_queue): if not msg_queue: msg_queue.append(MsgNode(msg, sender, receiver)) else: _send_msg(msg, sender, receiver, msg_queue[0]) def _send_msg(msg, sender, receiver, node): if node.receiver == receiver: node.children.append(MsgNode(msg, sender, receiver)) else: for child in node.children: _send_msg(msg, sender, receiver, child) def receive_msg(receiver, msg_queue): if not msg_queue: return None else: msg_node = _receive_msg(receiver, msg_queue[0]) if msg_node: msg_queue[0].children.remove(msg_node) return msg_node.msg def _receive_msg(receiver, node): if node.receiver == receiver: if node.children: return node.children[0] else: return node else: for child in node.children: msg_node = _receive_msg(receiver, child) if msg_node: return msg_node return None # 示例代码 msg_queue = [] send_msg("Hello, World!", "P1", "P2", msg_queue) send_msg("How are you?", "P2", "P1", msg_queue) print(receive_msg("P1", msg_queue)) print(receive_msg("P1", msg_queue)) ``` 以上是本人提供的示例代码,仅供参考。如果您有任何疑问或者需要进一步的帮助,欢迎继续追问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值