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

Linux系统编程——进程间通信:消息队列

作者头像
马修
发布2021-01-21 15:11:53
1.4K0
发布2021-01-21 15:11:53
举报

概述

消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下:

  1. 消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。
  2. 消息队列允许一个或多个进程向它写入或者读取消息。
  3. 与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。
  4. 每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。
  5. 消息队列是消息的链表,存放在内存中,由内核维护。只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除消息队列,消息队列会一直存在于系统中。

消息队列常用操作函数如下:

对于消息队列的操作,我们可以类比为这么一个过程:假如 A 有个东西要给 B,因为某些原因 A 不能当面直接给 B,这时候他们需要借助第三方托管(如银行),A 找到某个具体地址的建设银行,然后把东西放到某个保险柜里(如 1 号保险柜),对于 B 而言,要想成功取出 A 的东西,必须保证去同一地址的同一间银行取东西,而且只有 1 号保险柜的东西才是 A 给自己的。

对于上面的例子,涉及到几个比较重要的信息:地址、银行、保险柜号码

只有同一个地址才能保证是同一个银行,只有是同一个银行双方才能借助它来托管,只有同一个保险柜号码才能保证是对方托管给自己的东西。

而在消息队列操作中,键(key)值相当于地址,消息队列标示符相当于具体的某个银行消息类型相当于保险柜号码。

同一个键(key)值可以保证是同一个消息队列,同一个消息队列标示符才能保证不同的进程可以相互通信,同一个消息类型才能保证某个进程取出是对方的信息。

键(key)值

System V 提供的进程间通信机制需要一个 key 值,通过 key 值就可在系统内获得一个唯一的消息队列标识符。key 值可以是人为指定的,也可以通过 ftok() 函数获得。

需要的头文件:

key_t ftok(const char *pathname, int proj_id);

功能:

参数:

返回值:

消息队列的创建

所需头文件:

int msgget(key_t key, int msgflg);

功能:

参数:

返回值:

示例代码如下:

运行结果如下:

消息队列的读写操作

对于消息队列的读写,都是以消息类型为准。消息类型相当于保险柜号码,A 往 1 号保险柜放东西,对方想取出 A 的东西必须也是从 1 号保险柜里取。同理,某一进程往消息队列添加 a 类型的消息,别的进程要想取出这进程添加的信息也必须取 a 类型的消息。

在学习消息队列读写操作前,我们先学习消息队列的消息格式:

消息类型必须是长整型的,而且必须是结构体类型的第一个成员,类型下面是消息正文,正文可以有多个成员(正文成员可以是任意数据类型的)。至于这个结构体类型叫什么名字,里面成员叫什么名字,自行定义,没有明文规定。

添加信息

所需头文件:

int msgsnd( int msqid, const void *msgp, size_t msgsz, int msgflg)

功能:

参数:

返回值:

获取信息

所需头文件:

ssize_t msgrcv( int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg )

功能:

参数:

返回值:

消息队列的控制

所需头文件:

int msgctl(int msqid, int cmd, struct msqid_ds *buf) 功能:

参数:

返回值:

实践示例

写端示例代码如下:

读端示例代码如下:

运行结果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 键(key)值
    • key_t ftok(const char *pathname, int proj_id);
    • 消息队列的创建
      • int msgget(key_t key, int msgflg);
      • 消息队列的读写操作
        • 添加信息
          • 获取信息
          • 消息队列的控制
          • 实践示例
          相关产品与服务
          消息队列 CMQ 版
          消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档