MQ_RECEIVE - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-08-13
名称
mq_receive,mq_timedreceive-从消息队列接收消息
语法
#include <mqueue.h> ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio); #include <time.h> #include <mqueue.h> ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout);
与-lrt链接。
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
mq_timedreceive():
- _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指向一个结构,该结构指定调用将阻塞多长时间。自1970年1月1日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
- 呼叫在消息传送之前超时。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
mq_receive(),mq_timedreceive() | Thread safety | MT-Safe |
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
在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)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。