gpt4 book ai didi

linux - 为什么没有创建消息队列

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:19 24 4
gpt4 key购买 nike

我正在学习消息队列,写代码创建消息队列

#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

如果我犯了什么错误,你们能告诉我吗

最佳答案

正如我所见,您的代码没有任何问题,但行为真的很奇怪,即使在我的系统上也是如此。

由于 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 的新消息队列,所以我无法再重现此行为。我不想再次重启 ;)

关于linux - 为什么没有创建消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55273228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com