当数据存在时,mq_receive返回EAGAIN

时间:2014-05-16 13:15:54

标签: c++ linux mqueue

我有一个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始终使用errno EAGAIN返回-1。从文档中,这应该意味着队列中没有消息。请注意,它是NONBLOCKING。

1 个答案:

答案 0 :(得分:0)

问题是代码错误。打开的电话应该是

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