【问题标题】:POSIX Message Queue Receive TimeoutPOSIX 消息队列接收超时
【发布时间】:2018-07-18 08:54:35
【问题描述】:
if((nbytes=mq_receive (qid_recv, (pchar_t)in_buffer, msg_buffer_size, NULL)) != -1) {
            printf("nbytes is %ld\n", nbytes);
}else{
     perror("recv_data");
     printf("nbytes is %ld\n", nbytes);

如果没有收到消息,如何退出 mq_receive。是否有可能超时。感谢您的时间。

【问题讨论】:

    标签: c queue posix


    【解决方案1】:

    除了mq_timedreceive(),你还可以在用mq_open()打开队列时设置O_NONBLOCK。每the mq_open() documentation

    O_NONBLOCK 确定 mq_send()mq_receive() 是等待当前不可用的资源或消息,还是失败且 errno 设置为 EAGAIN;详见mq_sendmq_receive

    the mq_receive() documentation:

    如果指定的消息队列为空,并且在与mqdes 关联的消息队列描述中设置了O_NONBLOCK,则不应从队列中删除任何消息,并且mq_receive() 应返回错误。

    【讨论】:

    • 当我使用 mq_timedreceive 并在 mq_open 中设置 O_NONBLOCK 时,当没有收到消息时返回错误。
    • @Einsenheim 是的,errno 应该设置为 EAGAIN。这样你就知道没有消息了。
    • 感谢 Andrew Henle。
    • 这些超时是非单调的……所以在连接到 GPS 的嵌入式系统中……这可能会导致有趣的行为
    【解决方案2】:

    您可以使用 mq_timedreceive 函数。

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 2011-06-25
      • 2013-10-10
      • 2019-03-17
      • 2020-11-27
      • 2019-01-10
      • 1970-01-01
      • 2020-04-18
      • 2012-01-19
      相关资源
      最近更新 更多