mq_receive(3) - Linux 手册页
名称
mq_receive, mq_timedreceive - 从消息队列接收消息
概要
#include <mqueue.h> ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio); #include <time.h> #include <mqueue.h> ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout);链接 -lrt。
glibc 的功能测试宏要求(参见 feature_test_macros(7))
- mq_timedreceive():
- _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
描述
mq_receive() 从由文件描述符 mqdes 指示的消息队列中移除最旧且优先级最高的消息,并将其放置在 msg_ptr 指向的缓冲区中。msg_len 参数指定 msg_ptr 指向的缓冲区的大小;这必须大于队列的 mq_msgsize 属性(参见 mq_getattr(3))。如果 msg_prio 不为 NULL,则指向它的缓冲区用于返回接收到的消息关联的优先级。
如果队列为空,则默认情况下,mq_receive() 会阻塞,直到有消息可用,或者调用被信号处理程序中断。如果消息队列描述符的 O_NONBLOCK 标志已启用,则调用会立即失败,并返回错误 EAGAIN。
mq_timedreceive() 的行为与 mq_receive() 相同,除了当队列为空且消息队列描述符的 O_NONBLOCK 标志未启用时,abs_timeout 指向一个结构体,该结构体指定调用阻塞的时间上限。该上限是自 Epoch(1970-01-01 00:00:00 +0000 (UTC))以来以秒和纳秒为单位的绝对超时时间,并在以下结构体中指定
-
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; - 如果没有消息可用,并且在调用时超时已经过期,mq_timedreceive() 会立即返回。
返回值
成功时,mq_receive() 和 mq_timedreceive() 返回接收到的消息的字节数;出错时,返回 -1,并设置 errno 以指示错误。
错误
- EAGAIN
队列为空,并且为由 mqdes 指示的消息队列描述符设置了 O_NONBLOCK 标志。
EBADF
mqdes 中指定的描述符无效。
EINTR
调用被信号处理程序中断;请参阅 signal(7)。
EINVAL
调用会阻塞,并且 abs_timeout 无效,因为 tv_sec 小于零,或者因为 tv_nsec 小于零或大于 10 亿。
- EMSGSIZE
- msg_len 小于消息队列的 mq_msgsize 属性。
- ETIMEDOUT
- 调用超时,无法传输消息。
符合
POSIX.1-2001。
说明
在 Linux 上,mq_timedreceive() 是一个系统调用,而 mq_receive() 是构建在该系统调用之上的库函数。
参见
mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_send(3), mq_unlink(3), mq_overview(7), time(7)