msgctl-系统V消息控制操作
头文件
#include <sys / types.h>
#include <sys / ipc.h>
#include <sys / msg.h>
函数
int msgctl(int msqid ,int cmd ,struct msqid_ds * buf );控制消息队列
第一个参数msgqid 是消息队列对象的标识符。
所述的msqid_ds数据结构定义在在<sys / msg.h>如下:
struct msqid_ds {
struct ipc_perm msg_perm; / *所有权和权限* /
time_t msg_stime; / *最后一次msgsnd(2)的时间* /
time_t msg_rtime; / *最后一次msgrcv(2)的时间* /
time_t msg_ctime; / *创建时间/最后时间
通过msgctl()修改* /
无符号长__msg_cbytes;/ *当前的字节数
队列(非标准)* /
msgqnum_t msg_qnum; / *当前消息数
在队列中* /
msglen_t msg_qbytes; / *最大字节数
队列中允许* /
pid_t msg_lspid; / *最后一个msgsnd(2)的PID * /
pid_t msg_lrpid; / *最后一个msgrcv(2)的PID * /
};
msgid_ds结构的字段如下:
msg_perm 这是一个ipc_perm结构(请参见下文),用于指定消息队列上的访问权限。
msg_qnum 当前在消息队列上的消息数。
msg_qbytes邮件文本上允许的最大字节数消息队列。
msg_lspid 执行最后一个msgsnd(2)系统的进程的ID呼叫。
msg_lrpid 执行最后一个msgrcv(2)系统的进程的ID呼叫。
msg_stime 上一次msgsnd(2)系统调用的时间。
msg_rtime 上一次msgrcv(2)系统调用的时间。
msg_ctime 创建队列的时间或上一个msgctl()IPC_SET的时间操作。
所述的ipc_perm结构定义如下(突出显示的字段可使用IPC_SET设置):
struct ipc_perm {
key_t __key; / *提供给msgget(2)的密钥* /
uid_t uid ; / *所有者的有效UID * /
gid_t gid ; / *所有者的有效GID * /
uid_t cuid; / *创建者的有效UID * /
gid_t cgid; / *创建者的有效GID * /
无符号短模式 ; / *权限* /
无符号的短__seq; /* 序列号 */
};
第二个参数是函数要对消息队列进行的操作,它可以是:
IPC_STAT:取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构中。
IPC_SET:设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds结构给出。
IPC_EMID:将队列从系统内核中删除
IPC_INFO(特定于Linux)
返回有关系统范围内消息队列限制的信息,以及buf指向 的结构中的参数。这种结构如果定义了_GNU_SOURCE功能测试宏,则其类型为msginfo(因此需要强制转换),在
<sys / msg.h>中定义:
struct msginfo {
int msgpool; / *缓冲池的大小(以千字节为单位) 用于保存消息数据;在内核中未使用* /
int msgmap; / *消息中的最大条目数地图; 在内核中未使用* /
int msgmax; / *可以使用的最大字节数写在单个消息中* /
int msgmnb; / *可以使用的最大字节数写入队列;用于初始化队列创建过程中的单位msg_qbytes(msgget(2))* /
int msgmni; / *消息队列的最大数量* /
int msgssz; / *消息段大小;在内核中未使用* /
int msgtql; / *所有队列上的最大消息数在系统中 在内核中未使用* /
unsigned short int msgseg; / *最大段数;在内核中未使用* /
};
MSG_INFO (Linux-specific)
MSG_STAT (Linux-specific)
MSG_STAT_ANY (Linux-specific, since Linux 4.17)
返回值
成功时,IPC_STAT,IPC_SET和IPC_RMID返回0。成功的IPC_INFO或MSG_INFO操作返回内核内部阵列中使用最高的条目的索引,该索引记录有关所有 消息队列的信息。(此信息可以与重复的MSG_STAT 或MSG_STAT_ANY操作一起使用,以获取有关系统上所有队列的信息。)成功的MSG_STAT或MSG_STAT_ANY操作将返回其索引在msqid中给出的队列的标识符。
发生错误时,返回-1,并带有errno表示错误。
版权声明:本文为weixin_43117602原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。