为什么msgrcv会返回ENOMSG

时间:2016-07-19 03:02:51

标签: c linux

成功创建了System V消息队列,命令ipcs -q输出:

 ------ Message Queues --------<
 key        msqid      owner      perms      used-bytes   messages    
 0x080b2fb4 0          hel         600        0            0          

但接收消息的程序返回:

  

退出:msgrcv错误,没有所需类型的消息

这是我的代码:

/* create key for message queue */
key = ftok("/home/hel/messageQueueSystemV", 8);
if (key == -1) {
    printf("exit: ftok error, %s\n", strerror(errno)); // error
    exit(0);
}

/* open existed message queue */
mqFd = msgget(key, 0600);
if (mqFd < 0) {
    printf("exit: msgget error, %s\n", strerror(errno)); // error
    exit(0);
}

/* receive a message */
if (msgrcv(mqFd, &buf, 1 + sizeof(short), 0, IPC_NOWAIT) < 0) { // type is 0
    printf("exit: msgrcv error, %s\n", strerror(errno)); // error
    exit(0);
}

1 个答案:

答案 0 :(得分:2)

将评论转移到答案。

我建议:

  

也许没有消息在等待?您在哪里编写代码以将消息发送到队列?

回应是:

  

首先,我运行一个程序来创建消息队列并发送消息。然后使用命令ipcs -q检查它是否成功。然后我开始另一个进程来接收该消息。

开始吵架:

  

ipcs的输出表示没有排队的邮件。你告诉msgrcv()不要等,所以没有,所以它返回“没有排队的消息”。我不理解的是什么?

而且,看起来,这是正确的诊断。