C: 无法打开消息队列

标签 c message-queue

我正在研究 OpenSuse 42.3 Leap。这是我第一次接触 Unix 消息队列,我在简单地打开一个新队列时遇到了一些基本问题。我最初的问题是我无法打开两个队列,但经过几次尝试后我将问题简化为这种奇怪的行为:

如果我编译并运行它

#include<stdio.h>
#include <mqueue.h>

int main() {

//    printf("Hello world!\n");

/* create queue */
char *q_name = "/myQueue";
mqd_t desc = mq_open(q_name, O_RDWR | O_CREAT);
if(desc == (mqd_t) -1)
    perror("Error in mq_open");
printf("We have opened %d\n", desc);

/* close descriptor and unlink name */
if (mq_close(desc)) perror("Error in close:");
if (mq_unlink(q_name)) perror("Error in unlink:");

return 0;
}

它与标准输出配合得很好:

We have opened 3

队列已正确关闭,我可以毫无错误地重新运行它。

但是如果我取消注释该行

printf("Hello world!\n");

它显然仍然可以正确编译,但运行时会输出

Hello world!
Error in mq_open: Invalid argument
We have opened -1
Error in close:: Bad file descriptor
Error in unlink:: No such file or directory

如果不是简单的 'Hello world!我尝试打印:

printf("Hello world! My pid = %d\n", getpid());

然后代替 Invalid argument 错误

Error in mq_open: Bad address

已制作。

知道为什么这个简单的 printf 会导致队列打开崩溃吗?

最佳答案

来自 mq_open 手册页:

If O_CREAT is specified in oflag, then two additional arguments must be supplied. [...]

你不提供它们,所以你有未定义的行为。似乎发生的情况是,丢失的参数是从内存中它们本来应该存在的地方获取的,并且那里发生的情况会有所不同,具体取决于您的程序之前执行的操作。

关于C: 无法打开消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47954102/

相关文章:

java - 消息队列或调度程序

c++ - Win32 消息处理程序错误传播

c - 是否可以确定符号是 C 中的变量还是函数?

c - 将参数从指针传递到非封闭地址空间时出错

java - xml 消息的队列服务器

linux - 消息队列 msgsnd 多行文本字段

javascript - 将无类型数组编译为 C 的有效方法是什么?

c - 在循环内运行 fork 会产生意想不到的结果(测量进程切换时间)

有人可以解释 C 如何处理 for 循环中的结构声明吗? (见例子)

c - 如何将 Libev io 与 mqueue 一起使用