备注

在Linux上,mq_timedsend()是系统调用,而mq_send()是在该系统调用之上分层的库函数。

语法

#include <mqueue.h>

int mq_send(mqd_t mqdes, const char *msg_ptr,
              size_t msg_len, unsigned int msg_prio);

#include <time.h>
#include <mqueue.h>

int mq_timedsend(mqd_t mqdes, const char *msg_ptr,
              size_t msg_len, unsigned int msg_prio,
              const struct timespec *abs_timeout);

与-lrt链接。

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

mq_timedsend():

_POSIX_C_SOURCE>= 200112L
MQ_SEND - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-08-13

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

名称

mq_send,mq_timedsend-将消息发送到消息队列

说明

mq_send()将msg_ptr指向的消息添加到消息队列描述符mqdes引用的消息队列中。 msg_len参数指定msg_ptr指向的消息的长度;该长度必须小于或等于队列的mq_msgsize属性。允许零长度的消息。

msg_prio参数是一个非负整数,它指定此消息的优先级。消息以优先级从高到低的顺序排列在队列中,而具有相同优先级的新消息则放在具有相同优先级的旧消息之后。有关消息优先级范围的详细信息,请参见mq_overview(7)。

如果消息队列已满(即,队列中的消息数等于队列的mq_maxmsg属性),则默认情况下,mq_send()会阻塞,直到有足够的空间可用于将消息排队或直到调用被信号处理程序中断。如果为消息队列描述启用了O_NONBLOCK标志,则调用将立即失败,并显示错误EAGAIN。

mq_timedsend()的行为与mq_send()相同,不同之处在于,如果队列已满并且未对消息队列描述启用O_NONBLOCK标志,则abs_timeout指向一个结构,该结构指定调用将被阻塞多长时间。自1970年1月1日00:00:00 +0000(UTC)开始以来的绝对超时,以秒和纳秒为单位,在以下结构中指定:

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};

如果消息队列已满,并且超时已在调用时到期,则mq_timedsend()立即返回。

另外参见

mq_close(3),mq_getattr(3),mq_notify(3),mq_open(3),mq_receive(3),mq_unlink(3),mq_overview(7),time(7)

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
mq_send(),mq_timedsend()Thread safetyMT-Safe

返回值

成功时,mq_send()和mq_timedsend()返回零;如果出错,则返回-1,并设置errno表示错误。

遵循规范

POSIX.1-2001,POSIX.1-2008。

错误说明

EAGAIN
队列已满,并且为mqdes引用的消息队列描述设置了O_NONBLOCK标志。
EBADF
mqdes中指定的描述符无效或未打开以进行写入。
EINTR
呼叫被信号处理程序中断;参见signal(7)。
EINVAL
该调用将被阻止,并且abs_timeout无效,原因可能是tv_sec小于零,或者tv_nsec小于零或大于10亿。
EMSGSIZE
msg_len大于消息队列的mq_msgsize属性。
ETIMEDOUT
呼叫在消息传送之前超时。
日期:2019-08-20 18:00:55 来源:oir作者:oir