linux msgctl函数,Linux系统编程—消息队列

本文介绍了Linux下消息队列的概念,包括其内部结构和消息类型特性。详细阐述了消息队列相关的函数msgget、msgsnd、msgrcv和msgctl的使用方法,以及消息数据的格式要求。通过示例程序msg_send和msg_recv展示了如何向消息队列发送和接收消息,并提供了msgctl函数用于查看和设置消息队列属性。
摘要由CSDN通过智能技术生成

1、消息队列简介

消息队列本质上是位于内核空间的链表,链表的每个节点都是一条消息。每一条消息都有自己的消息类型,消息类型用整数来表示,而且必须大于 0。每种类型的消息都被对应的链表所维护:

7e3045cf1ab8?ivk_sa=1024320u

图1 位于内核空间的消息队列.png

其中数字 1 表示类型为 1 的消息,数字2、3、4 类似。彩色块表示消息数据,它们被挂在对应类型的链表上。

值得注意的是,刚刚说过没有消息类型为 0 的消息,实际上,消息类型为 0 的链表记录了所有消息加入队列的顺序,其中红色箭头表示消息加入的顺序。

2、消息队列相关的函数

// 创建和获取 ipc 内核对象

int msgget(key_t key, int flags);

// 将消息发送到消息队列

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);

// 查看、设置、删除 ipc 内核对象(用法和 shmctl 一样)

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

3、消息数据格式

无论你是发送还是接收消息,消息的格式都必须按照规范来。简单的说,它一般长成下面这个样子:

struct Msg{

long type; // 消息类型。这个是必须的,而且值必须 > 0,这个值被系统使用

// 消息正文,多少字节随你而定

// ...

};

所以,只要你保证首4字节(32 位 linux 下的 long)是一个整数就行了。

举个例子:

struct Msg {

long type;

char name[20];

int age;

} msg;

struct Msg {

long type;

int start;

int end;

} msg;

从上面可以看出,正文部分是什么数据类型都没关系,因为消息队列传递的是 2 进制数据,不一定非得是文本。

4、msgsnd 函数

msgsnd 函数用于将数据发送到消息队列。如果该函数被信号打断,会设置 errno 为 EINTR。

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

参数 msqid:ipc 内核对象 id

参数 msgp:消息数据地址

参数 msgsz:消息正文部分的大小(不包含消息类型)

参数 msgflg:可选项

该值为 0:如果消息队列空间不够࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值