我正在学习消息队列,编写了代码来创建消息队列
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
key_t key;
int msgid;
key = ftok("proj", 64);
if (key == -1) {
perror("ftok failed");
exit(1);
}
printf("key:%x\n", key);
//IPC_CREAT: creating message queue if not exists
msgid = msgget(key, IPC_CREAT);
if (msgid == -1) {
perror("msgget failed");
printf("errno:%d\n", errno);
if (errno == ENOENT)
printf("No message queue exists for key and msgflg did not specify IPC_CREAT\n");
exit(2);
}
printf("msgid:%x\n", msgid);
return 0;
}
运行命令未显示输出:ipcs -q
panther2@ubuntu:~/c_codes/msg_queue$ ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
你们能告诉我我是否犯错了
答案 0 :(得分:1)
正如我所见,您的代码没有错,但是即使在我的系统上,该行为也确实很奇怪。
由于mssget
返回0,一切正常(应该返回一个非负数,0为),并且可以使用队列。
我在您的编末添加了for(;;);
,然后重新启动。 ipcs
现在显示:
0x4025077b 0 krud 0 0 0
我ipcrm -q 0
并再次启动程序后,每次运行都会得到一个新的ID。现在,我删除了无休止的循环,所有内容仍然有效,每次运行时,我都会得到一个具有不同编号的消息队列,在下一次运行之前,我总是必须销毁该队列。
那真的很奇怪!
我发现了很多有关该主题的报告,例如: https://www.unix.com/programming/248572-msgget-2-returns-0-workaround-fix.html http://forums.codeguru.com/showthread.php?403036-strange-problem-in-using-msgget%28%29-in-Linux
如果找到有效的解决方案,请通知我们!
由于我的系统现在每次运行时都会生成一个id> 0的新消息队列,因此我不再能够重现此行为。我不想再次重启;)