【问题标题】:mq_open: Invalid argumentmq_open:无效参数
【发布时间】:2012-04-17 08:30:54
【问题描述】:

我正在尝试为 mq_notify 的 man page 中找到的 POSIX 消息队列运行示例程序。我以./mq '/bla' 运行它,它给了我错误mq_open: Invalid argument

这是示例程序中给出错误的行:

mqdes = mq_open(argv[1], O_RDONLY);

我试过改成

mqdes = mq_open("/bla", O_RDONLY | O_CREAT);

但还是不行。

这一定很简单,但我想不通。我做错了什么?

顺便说一下,这是 RHEL 5.8。

编辑:第一个错误我错了。如果没有 O_CREAT,它会说“没有这样的文件或目录”。我猜它试图打开一个不存在的消息队列。对于 O_CREAT,我认为无效参数错误是因为我只有两个参数,而 O_CREAT 需要四个。

【问题讨论】:

  • 发布该示例程序的 strace 输出。但请注意,如果您将其更改为使用 O_CREAT,您需要将 2 个额外的参数传递给 mq_open()。例如mq_open(argv[1], O_RDONLY | O_CREAT, 0666, NULL);
  • @nos 哦,解决了。我认为我的第一个错误是错误的。如果我没有 O_CREAT,它会说“没有这样的文件”之类的。当我添加 O_CREAT 时,我猜“无效参数”是缺少的参数 3 或 4。谢谢。如果你想把它写成一个,我可以接受这个作为答案。

标签: c linux posix message-queue


【解决方案1】:

如果消息队列不存在,mq_open(argv[1], O_RDONLY); 应该会失败并显示“ENOENT(没有这样的文件或目录)”。

如果将其更改为使用 O_CREAT,则需要将 2 个附加参数传递给 mq_open()。 (阅读关于 O_CREAT 的段落)。

    mq_open(argv[1], O_RDONLY | O_CREAT, 0666, NULL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多