前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进程间通信方式——消息队列

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

作者头像
全栈程序员站长
发布2022-11-07 14:55:33
8030
发布2022-11-07 14:55:33
举报

1.消息队列

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

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

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

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

代码语言:javascript
复制
struct msqid_ds
  {
    struct ipc_perm msg_perm;  //消息队列访问权限
    struct msg *msg_first;    //指向第一个消息的指针
    struct msg *msg_last;     //指向最后一个消息的指针
	ulong  msg_cbytes;       //消息队列当前的字节数
	ulong  msg_qnum;        //消息队列当前的消息个数
	ulong  msg_qbytes;     //消息队列可容纳的最大字节数
	pid_t  msg_lsqid;     //最后发送消息的进程号ID
	pid_t  msg_lrqid;     //最后接收消息的进程号ID
	time_t msg_stime;     //最后发送消息的时间
	time_t msg_rtime;     //最后接收消息的时间
	time_t msg_ctime;    //最近修改消息队列的时间
};

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

代码语言:javascript
复制
struct msg_queue {
    structkern_ipc_perm q_perm;
    time_tq_stime;         /* last msgsndtime */
    time_tq_rtime;         /* last msgrcvtime */
    time_tq_ctime;         /* last changetime */
    unsignedlong q_cbytes;     /* current number of bytes on queue*/
    unsignedlong q_qnum;       /* number of messages inqueue */
    unsignedlong q_qbytes;     /* max number of bytes on queue */
    pid_tq_lspid;          /* pid oflast msgsnd */
    pid_tq_lrpid;          /* lastreceive pid */
    structlist_head q_messages;
    structlist_head q_receivers;
    structlist_head q_senders;
};                                                                                                                                                         

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

代码语言:javascript
复制
struct ipc_perm
{
   key_t  key;         //调用shmget()时给出的关键字
   uid_t  uid;        //共享内存所有者的有效用户ID 
   gid_t  gid;        //共享内存所有者所属组的有效组ID 
   uid_t  cuid;       //共享内存创建 者的有效用户ID
   gid_t  cgid;      //共享内存创建者所属组的有效组ID
  unsigned short  mode; //Permissions + SHM_DEST和SHM_LOCKED标志
  unsignedshort   seq;         //序列号
};

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

3.1创建打开消息队列

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

3.2添加消息

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

3.3读取消息

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

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

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

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

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

附:

进程间通信方式

进程—管道间通信方式

进程间通信方式—信号量

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184271.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年10月9日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.消息队列
  • 2.消息队列的三个数据结构
    • linux内核采用的结构msqid_ds管理消息队列
      • linux内核采用的结构msg_queue来描述消息队列
        • syetem V IPC 为每一个IPC结构设置了一个ipc_perm结构,该结构规定了许可权和所有者
        • 3.与消息队列有关的函数
          • 3.1创建打开消息队列
            • 3.2添加消息
              • 3.3读取消息
                • 3.4获得或修改消息队列或者删除消息队列
                  • 进程间通信方式——共享内存
              • 4.消息队列读取数据工作模式
              相关产品与服务
              消息队列 CMQ 版
              消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档