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。