kmsgctl 内核服务

用途

提供消息队列控制操作。

语法

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

参数

描述
msqid 指定消息队列标识,该消息队列标识指示正在为其请求控制操作的消息队列。
cmd 指定正在请求哪个控制操作。 有三个有效命令。
布夫 指向由 kmsgctl 服务的调用者提供的 msqid_ds 结构。 根据 命令 参数,从该结构或从该结构中返回的状态中获取数据。 msqid_ds 结构在 /usr/include/sys/msg.h 文件中定义。

描述

kmsgctl 内核服务提供各种消息队列控制操作,如 命令 参数所指定。 kmsgctl 内核服务为内核方式下的用户方式进程提供与 消息控制 子例程为内核进程或用户方式下的用户方式进程执行的功能相同的功能。 kmsgctl 服务可以由内核方式下的用户方式进程或由内核进程调用。 内核进程也可以调用 消息控制 子例程以提供相同的函数。

可以使用 命令 参数来指定以下三个命令:

描述
IPC_STAT 仅设置记录的字段。 请参阅 消息控制 子例程。
IPC_SET 将与 姆斯基德 参数关联的数据结构的以下字段的值设置为在 布夫 参数指向的结构中找到的相应值:
  • msg_perm.uid
  • msg_perm.gid
  • msg_perm.mode(仅低阶 9 位)
  • msg_qbytes

要执行 IPC_SET 操作,当前进程必须具有等于以下项的值的有效用户标识:msg_perm.uidmsg_perm.cuid姆斯基德 参数关联的数据结构中的字段。 提高该系统的价值msg_qbytes字段,调用进程必须具有相应的系统特权。

IPC_RMID 从系统中移除由 姆斯基德 参数指定的消息队列标识。 此操作还会破坏消息队列以及与该消息队列相关联的数据结构。 要执行此操作,当前进程必须具有等于该值的有效用户标识。msg_perm.uidmsg_perm.cuid姆斯基德 参数关联的数据结构中的字段。

执行环境

kmsgctl 内核服务只能从进程环境中进行调用。

返回值

描述
重大安全事件数量 指示成功完成。
EINVAL 指示
  • 姆斯基德 参数指定的标识不是有效的消息队列标识。
  • 命令 参数指定的命令不是有效的命令。
EACCES 命令 参数指定的命令等于 IPC_STAT ,并且对调用过程拒绝了读许可权。
EPERM 命令 参数指定的命令等于 IPC_RMIDIPC_SET,并且调用进程的有效用户标识不等于调用进程的值的值msg_perm.uid姆斯基德 参数关联的数据结构中的字段。
EPERM 指示以下条件:
  • 命令 参数指定的命令等于 IPC_SET
  • 正在尝试增大到msg_qbytes但调用进程不具有相应的系统特权。