MQ_RECEIVE - Linux手册页

时间:2019-08-20 18:00:54  来源:igfitidea点击:

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)。

InterfaceAttributeValue
mq_receive(),mq_timedreceive()Thread safetyMT-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/