Linux消息队列

ops/2025/3/2 8:22:12/

msgget函数(类似于shmget)

是 Linux 系统中用于 创建或获取消息队列(System V Message Queue) 的系统调用。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>int msgget(key_t key, int msgflg);

参数说明
key
消息队列的键值(唯一标识符)。
可通过 ftok 函数生成,或使用 IPC_PRIVATE 创建一个私有队列(仅当前进程可用)。
如果 key 已存在且未设置 IPC_CREAT,则返回该键值对应的消息队列标识符。

msgflg
控制消息队列的创建和权限的标志位,由以下值组合(按位或 |):

IPC_CREAT:如果消息队列不存在,则创建它。
IPC_EXCL:与 IPC_CREAT 一起使用时,若消息队列已存在,则返回错误。
权限标志:例如 0666 表示所有用户可读写(需结合 IPC_CREAT 使用)。

返回值
成功:返回消息队列的标识符msqid(非负整数)。
失败:返回 -1,并设置 errno。

msgctl函数(类似于shmctl函数)

是 Linux 系统中用于 控制消息队列(System V Message Queue) 的系统调用。它可以删除消息队列、获取或设置队列信息(如权限、状态等)。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>int msgctl(int msqid, int cmd, struct msqid_ds *buf);

参数说明
msqid
消息队列的标识符,由 msgget 函数返回。

cmd
控制命令,指定要对消息队列执行的操作,常见值包括:

IPC_STAT:获取消息队列的信息,保存到 buf 指向的 msqid_ds 结构。
IPC_SET:通过 buf 修改消息队列的权限、属主等(需有权限)。
IPC_RMID:立即删除消息队列,并唤醒所有等待的进程。

buf
指向 msqid_ds 结构体的指针,用于传递或接收消息队列的信息。
当 cmd 为 IPC_RMID 时,此参数可设为 NULL。

返回值
成功:返回 0。
失败:返回 -1,并设置 errno(如 EINVAL、EPERM、EACCES 等)。

struct msqid_ds {struct ipc_perm msg_perm;  // 权限信息time_t          msg_stime; // 最后发送消息的时间time_t          msg_rtime; // 最后接收消息的时间time_t          msg_ctime; // 最后修改时间unsigned long   msg_cbytes;// 当前队列中的字节数msgqnum_t       msg_qnum;  // 当前队列中的消息数msglen_t        msg_qbytes;// 队列允许的最大字节数pid_t           msg_lspid; // 最后发送消息的进程PIDpid_t           msg_lrpid; // 最后接收消息的进程PID
};
#include <sys/ipc.h>struct ipc_perm {key_t          __key;    // IPC 对象的键值uid_t          uid;      // 属主的用户IDgid_t          gid;      // 属主的组IDuid_t          cuid;     // 创建者的用户IDgid_t          cgid;     // 创建者的组IDunsigned short mode;     // 权限模式(如 0666)unsigned short __seq;    // 序列号(内部使用)
};

msgsnd函数

Linux 系统中用于 向消息队列发送消息 的系统调用。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数说明
msqid
消息队列的标识符,由 msgget 函数返回。

msgp
指向消息缓冲区的指针。消息的格式必须符合以下结构:

struct msgbuf {long mtype;      // 消息类型(必须 > 0)char mtext[100]; // 消息内容(自定义长度)
};

mtype 是消息类型,用于区分不同类型的消息。
mtext 是消息内容,长度由 msgsz 指定。

msgsz
消息内容的长度(以字节为单位),不包括 mtype 字段。

msgflg
控制发送行为的标志位,常见值包括:
0:默认行为,如果消息队列已满,则阻塞直到有空间。
IPC_NOWAIT:如果消息队列已满,立即返回错误(EAGAIN)。

返回值
成功:返回 0。
失败:返回 -1,并设置 errno(如 EAGAIN、EINTR、EACCES 等)。

msgrcv函数

msgrcv 是 Linux 系统中用于 从消息队列接收消息 的系统调用。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

参数说明
msqid
消息队列的标识符,由 msgget 函数返回。

msgp
指向消息缓冲区的指针。消息的格式必须符合以下结构:

struct msgbuf {long mtype;      // 消息类型(必须 > 0)char mtext[100]; // 消息内容(自定义长度)
};

mtype 是消息类型,用于区分不同类型的消息。
mtext 是消息内容,长度由 msgsz 指定。

msgsz
消息缓冲区的最大容量(以字节为单位),不包括 mtype 字段。

msgtyp
指定要接收的消息类型:

0:接收队列中的第一条消息(无论类型)。
> 0:接收类型等于 msgtyp 的第一条消息。
< 0:接收类型小于或等于 |msgtyp| 的第一条消息。

msgflg

控制接收行为的标志位,常见值包括:

0:默认行为,如果队列中没有符合条件的消息,则阻塞直到有消息。
IPC_NOWAIT:如果队列中没有符合条件的消息,立即返回错误(ENOMSG)。 MSG_NOERROR:如果消息内容长度超过。
msgsz,则截断消息而不返回错误。

返回值
成功:返回实际接收到的消息内容的字节数。
失败:返回 -1,并设置 errno。


http://www.ppmy.cn/ops/162458.html

相关文章

【开源-线程池(Thread Pool)项目对比】

一些实现**线程池&#xff08;Thread Pool&#xff09;**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用&#xff0c;代码简洁&#xff1b;适合快速原型开发。功能较为基础&#xff0c;不支持动态调整线程数…

HTMLS基本结构及标签

HTML5是目前制作网页的核心技术&#xff0c;有叫超文本标记语言。 基本结构 声明部分位于文档的最前面&#xff0c;用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后&#xff0c;用于告知浏览器这是一个HTML文档。< html>表示文档开始&#xff0c;&l…

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…

神经网络|(十一)|神经元和神经网络。

【1】引言 前序已经了解了基本的神经元知识&#xff0c;相关文章链接为&#xff1a; 神经网络|(一)加权平均法&#xff0c;感知机和神经元-CSDN博客 神经网络|(二)sigmoid神经元函数_sigmoid函数绘制-CSDN博客 神经网络|(三)线性回归基础知识-CSDN博客 把不同的神经元通过…

【JAVA-数据结构】Lambda表达式

还是老规矩&#xff0c;继续进行&#xff0c;有需要的大家持续关注。 1 背景 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达…

Unity自动旋转物体功能实现

功能描述 实现简单的功能&#xff1a;让一个3D物体在Unity场景中自动旋转。这个功能可以通过调整旋转速度和旋转轴来适应不同的需求。 实现步骤 创建Unity项目&#xff1a;首先&#xff0c;打开Unity并创建一个新的3D项目。 添加3D物体&#xff1a;在场景中创建一个3D物体&…

瑞芯微RK安卓Android主板GPIO按键配置方法,触觉智能嵌入式开发

触觉智能分享&#xff0c;瑞芯微RK安卓Android主板GPIO按键配置方法&#xff0c;方便大家更好利用空闲IO&#xff01;由触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持安卓Android、开源鸿蒙Open…

【漫话机器学习系列】110.线性可分(Linearly Separable)

线性可分与线性不可分的概念详解 1. 引言 在机器学习和模式识别领域&#xff0c;分类问题是一个重要的研究方向。在分类任务中&#xff0c;我们通常需要将不同类别的数据点分开&#xff0c;而如何进行分割是一个关键问题。线性可分&#xff08;Linearly Separable&#xff09…