kmsgrcv 内核服务

用途

从消息队列中读取消息。

语法

#include <sys/types.h>
#include <sys/errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int kmsgrcv
(
msqid, msgp, msgsz,
msgtyp
, msgflg, flags, bytes)
int  msqid;
struct msgxbuf * msgp;
   or struct msgbuf *msgp;
int  msgsz;
mtyp_t  msgtyp;
int  msgflg;
int  flags;
ssize_t * bytes;

参数

描述
msqid 指定要从中读取的消息队列。
消息 指向 msgxbuf姆格布夫 结构,消息文本放置在该结构中。 指向的结构的类型由 标志 参数的值确定。 这些结构在 /usr/include/sys/msg.h 文件中定义。
消息 指定要从消息队列中接收的文本的最大字节数。 如果消息长度超过此大小,并且在 消息 参数中设置了 MSG_NOERROR ,那么接收到的消息将截断为 消息 参数指定的大小。 消息的截断部分将丢失,并且不会向调用进程提供截断的指示。
消息类型 指定请求的消息类型,如下所示:
  • 如果 消息类型 参数等于 0 ,那么将接收到队列上的第一条消息。
  • 如果 消息类型 参数大于 0 ,那么将接收到由 消息类型 参数指定的类型的第一条消息。
  • 如果 消息类型 参数小于 0 ,那么将接收到小于或等于 消息类型 参数的绝对值的最低类型的第一条消息。
消息 指定值 0 ,或者通过对多个值之一进行逻辑 OR 运算来构造:
MSG_NOERROR
如果消息长度超过 消息 参数指定的字节数,那么会截断该消息。
IPC_NOWAIT
指定在队列中不存在所需类型的消息时要执行的操作:
  • 如果设置了 IPC_NOWAIT ,那么 克姆斯格尔茨夫 服务将返回 ENOMSG 值。
  • 如果未设置 IPC_NOWAIT ,那么调用进程将暂挂执行,直到发生下列其中一种情况:
    • 将所需类型的消息放置在队列上。
    • 姆斯基德 参数指定的消息队列标识将从系统中除去。 发生此情况时, 克姆斯格尔茨夫 服务将返回 EIDRM 值。
    • 呼叫进程接收到一个要捕获的信号。 在此情况下,不会接收到消息,并且 克姆斯格尔茨夫 服务会返回 EINTR 值。
标志 如果要执行正常消息接收,那么指定值为 0。 如果要执行扩展消息接收,那么应该将此标志设置为 XMSG 值。 如果设置了此标志,那么 克姆斯格尔茨夫 服务将像 msgxrcv 子例程一样运行。 否则, 克姆斯格尔茨夫 服务将像 姆斯格尔茨夫 子例程一样运行。
字节 指定引用参数。 此参数包含从 克姆斯格尔茨夫 服务返回时从消息队列读取的消息/文本字节数。

如果消息长度超过由 消息 参数字节指定的字节数,但未设置 MSG_NOERROR ,那么 克姆斯格尔茨夫 内核服务将失败并返回 E2BIG 返回值。

描述

克姆斯格尔茨夫 内核服务从 姆斯基德 参数指定的队列中读取消息,并将该消息存储到 消息 参数所指向的结构中。 克姆斯格尔茨夫 内核服务为 内核方式 中的用户方式进程提供的功能与 姆斯格尔茨夫msgxrcv 子例程为 用户方式中的内核进程或用户方式进程提供的功能相同。

克姆斯格尔茨夫 服务可以由内核方式下的用户方式进程或由内核进程调用。 内核进程还可以调用 姆斯格尔茨夫msgxrcv 子例程来提供相同的函数。

执行环境

仅可从 流程环境 调用 克姆斯格尔茨夫 内核服务。

返回值

描述
重大安全事件数量 指示操作成功。
EINVAL 指示由 姆斯基德 参数指定的标识不是有效的消息队列标识。
EACCES 指示对调用进程的操作许可权被拒绝。
EINVAL 表示 消息 参数的值小于 0。
E2BIG 指示消息文本大于由 消息 参数指定的最大长度,并且未设置 MSG_NOERROR
ENOMSG 指示队列未包含所需类型的消息,并且已设置 IPC_NOWAIT
EINTR 指示 克姆斯格尔茨夫 服务已接收到信号。
EIDRM 指示已从系统中移除由 姆斯基德 参数指定的消息队列标识。