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

本文介绍了Linux中的消息队列原理及使用,包括msgget、msgsnd、msgrcv、msgctl等API,通过实例展示了如何创建、发送和接收消息,以及内核中的实现细节。
摘要由CSDN通过智能技术生成

消息队列 Msg Queue

如果你在 Windows 上开发过应用程序,想必你应该听过消息队列这个概念。在 Windows 中每个程序都有一个消息队列,整个程序在一个 loop 中等待从消息队列中取消息并执行,所以称 Windows 上的程序为事件驱动型。同样在 Linux 开发中也有消息队列这个概念,不过 Linux 中的消息队列是用来进行 IPC 的,本质上跟共享内存一样也是内存维护的一片内存区域。这篇文章带你学习消息队列的相关操作和内核机制。

系统中的消息队列

可以使用 ipcs -q 查看系统当前使用的消息队列(以下简称 MQ):

ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

我的系统当前没有任何 MQ,后面我们会用程序创建一个 MQ,然后再用这个命令查看。

消息队列的原理

MQ 传递的是消息,消息即是我们需要在进程间传递的数据。MQ 采用链表来实现消息队列,该链表是由系统内核维护,系统中可能有很多的 MQ,每个 MQ 用消息队列描述符(消息队列 ID:qid)来区分,qid 是唯一的,用来区分不同的 MQ。在进行进程间通信时,一个进程将消息加到 MQ 尾端,另一个进程从消息队列中取消息(不一定以先进先出来取消息,也可以按照消息类型字段取消息),这样就实现了进程间的通信。如下 MQ 的模型:

消息队列

进程 A 向内核维护的消息队列中发消息,进程 B 从消息队列中取消息,从而实现了 A 和 B 的进程间通信。了解了原理,来看看如何使用 MQ。

使用消息队列

MQ 的 API 操作与共享内存几乎是相同的,分为下面 4 个步骤:
1. 创建和访问 MQ
2. 发送消息
3. 接受消息
4. 删除 MQ

来分别学习这些函数。

1. 创建:msgget

使用 msgget 可以创建一个消息队列,需要指定创建的 key 和标志,key 与返回的 qid 有关系。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

/*
 * key:用来指定返回 MQ 的 ID
 * msgflg:创建的标志,例如 IPC_CREAT
 * return:成功返回队列 ID,失败返回 -1, 并设置 erron
 */
int msgget(key_t key, int msgflg);

2. 发送:msgsnd

使用 msgsnd 来发送一个消息,必须要有写消息队列的权限

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

/*
 * msgid:消息队列 ID
 * msgp:指向 msgbuf 的指针,用来指定发送的消息
 * msgsz:要发送消息的长度
 * msgflg:创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值