NAME
mq_receive - 从消息队列中获取消息 (REALTIME)
SYNOPSIS
#include <mqueue.h> ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio);
DESCRIPTION
函数 mq_receive() 会mqdes 指定的消息队列中取出最高优先级中排队时间最久的消息.
如果参数 msg_len 比消息队列的属性mq_msgsize 小, 函数会执行失败.
函数执行成功后,选定的消息会拷贝到参数msg_ptr 指定的内存中并且从消息队列中删除.
如果参数 msg_len 比 {SSIZE_MAX}大, 结果是由具体实现决定的.
如果参数 msg_prio 不是NULL, 消息的优先级会存储到 msg_prio 指向的内存中.
如果指定的消息队列是空的并且O_NONBLOCK没有被设置, 函数 mq_receive() 会阻塞到有消息排队或者函数 mq_receive() 被信号中断.
如果指定的消息队列是空的,有多个线程在等待从这个消息队列中接受消息,并且系统支持优先级调度,那么优先级最高等待时间最长的线程会接受消息.否则,哪一个线程接受消息是未指定的.
如果指定的消息队列是空的并且O_NONBLOCK被设置了, 函数会返回失败.
PARAMETERS
①mqdes
【OUT】消息队列的描述符
②msg_ptr
【IN】指向消息结构体的指针
③msg_len
【OUT】消息的字节数, 不能小于 mq_msgsize
④msg_prio
【IN】指向要保存消息优先级的内存
RETURN VALUE
如果函数执行成功, 函数返回0
如果函数执行失败,函数返回 -1 并且设置errno,errno的种别详见下面的ERRORS一节.
ERRORS
[EAGAIN]
O_NONBLOCK标志被设置并且消息队列是空的.
[EBADF]
参数 mqdes 不是有效的消息队列描述符.
[EINTR]
函数被信号中断.
[EINVAL]
函数已阻塞并且参数 abs_timeout 无效(无效是因为 tv_sec 小于0或者 tv_nsec 小于0或者 tv_nsec 大于 10亿(1000 million).
[EMSGSIZE]
参数 msg_len 指定的大小 小于消息队列的消息大小属性.
[EBADMSG]
检测到消息数据损坏.