msgctl 子例程

用途

提供消息控制操作。

标准 C 库 (libc.a)

语法

#include <sys/msg.h>

int msgctl (MessageQueueID,Command,Buffer)
int  MessageQueueID,  Command;
struct msqid_ds * Buffer;

描述

msgctl 子例程提供各种消息控制操作,这些操作由 Command 参数指定,并存储在 Buffer 参数指向的结构中。 msqid_ds 结构在 sys/msg.h 文件中定义。

以下限制适用于消息队列:

  • 最大消息大小为 4 兆字节。
  • 每个队列的最大消息数为 524288。
  • 最大消息队列标识数为 1048576。
  • 队列中的最大字节数为 4 兆字节。

参数

描述
MessageQueueID 指定消息队列标识。
命令 Command 参数的以下值可用:
IPC_STAT
将与MessageQueueID参数关联的数据结构的上述字段的当前值存储到Buffer参数指向的 msqid_ds结构中。

当前进程必须具有读许可权才能执行此操作。

IPC_SET
将与MessageQueueID参数关联的数据结构的以下字段的值设置为Buffer参数指向的结构中的相应值:
msg_perm.uid
msg_perm.gid
msg_perm.mode/*Only the low-order 
nine bits*/
msg_qbytes

当前进程的有效用户标识必须具有 root 用户权限,或者必须等于 msg_perm.uidmsg_perm.cuidMessageQueueID才能执行此操作。 要提高 msg_qbytes字段,当前进程的有效用户 ID 必须具有根用户权限。

IPC_RMID
从系统中删除MessageQueueID参数指定的消息队列标识符,并销毁与之相关的消息队列和数据结构。 当前进程的有效用户标识必须具有 root 用户权限或等于msg_perm.uidmsg_perm.cuidMessageQueueID来执行此操作。
缓冲区 指向 msqid_ds 结构。

返回值

成功完成后, msgctl 子例程返回值 0。 否则,返回值为-1,并设置errno全局变量来指示错误。

错误代码

如果下列任何条件成立,那么 msgctl 子例程不成功:

描述
EINVAL 命令MessageQueueID参数无效。
EACCES Command 参数等于 IPC_STAT 值,调用进程被拒绝读许可权。
EPERM Command 参数等于 IPC_RMID 值,并且调用进程的有效用户标识没有 root 用户权限。 或者, Command 参数等于 IPC_SET 值,并且调用进程的有效用户标识不等于msg_perm.uid字段或msg_perm.cuidMessageQueueID
EPERM Command 参数等于 IPC_SET 值,已尝试增大msg_qbytes字段,调用进程的有效用户标识不具有 root 用户权限。
Efault Buffer 参数点在进程地址空间之外。