【问题标题】:mq_receive returning EAGAIN when data is present当数据存在时,mq_receive 返回 EAGAIN
【发布时间】:2014-07-04 22:48:15
【问题描述】:

我有一个 mqueue,其中包含 2 条消息,但对 mq_receive 的调用不会提取数据。我以前对这个消息队列没有任何经验,所以请原谅我的无知。我相信发送端工作正常,因为回显“文件”确实显示了信息。

QSIZE:48 NOTIFY:1 SIGNO:0 NOTIFY_PID:5741

这是没有生成消息信号的 2 条消息。 PID 是将调用 mq_receive 的进程。

供参考,这里是开放代码。

msgq_attr.mq_maxmsg  = MAX_NUM_MESSAGES; // 20
msgq_attr.mq_msgsize = MAX_MSG_SIZE; // 256

mqrcv_id = mq_open(queue_name, O_RDONLY | O_NONBLOCK, 
                  S_IRWXU | S_IRWXO, msgq_attr);

notify.sigev_notify = SIGEV_NONE;    
notify.sigev_notify_attributes = NULL;          
mq_notify(mqrcv_id, &notify);

这是接收。

int msgSize = mq_receive(mqrcv_id, buffer,
                        MAX_MSG_SIZE, &msgprio);

msgSize 总是返回 -1 并带有 errno EAGAIN。从文档来看,这应该意味着队列中没有消息。请注意,它是非阻塞的。

【问题讨论】:

  • 我们不太可能从这些信息中确定多少。做一些基本的调试,这样你就绝对确定你确实确实将东西发送到了正确的队列,并且收到了通知信号,并将代码的相关部分与上下文一起发布(例如,我们看不到你的服务器调用的位置或时间mq_receive,我们也看不到消息被正确发送到正确的队列。
  • 消息在正确的队列中。正如我在问题描述中和具有 SIGEV_NONE 的代码中所解释的那样,没有发送任何信号。
  • @iostdev 很公平,这导致了另一个问题,因为您使用的是非阻塞队列,并且没有收到消息到达的通知,您何时调用 mq_receive ?

标签: c++ linux mqueue


【解决方案1】:

问题是代码错误。打开的调用应该是

mqrcv_id = mq_open(queue_name, O_RDONLY | O_NONBLOCK, 
              S_IRWXU | S_IRWXO, &msgq_attr);

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2020-05-20
    • 2022-12-22
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多