POSIX 消息队列 - 打开时出错:参数无效

Posted

技术标签:

【中文标题】POSIX 消息队列 - 打开时出错:参数无效【英文标题】:POSIX message queues - Error on open: Invalid argument 【发布时间】:2012-12-05 10:55:14 【问题描述】:

我在 linux 上创建消息队列时遇到问题。我得到的错误是“无效参数”。我必须强调的另一件事是代码是Qt项目的一部分。

常见的错误是名称不以 (/) 开头并且 arg 的数量不正确,但我已经检查了这些!

这是我要运行的代码:

#define MQ_TEST_PATH            "/test_queue"
#define MQ_MAX_MSG_SIZE         256
#define MQ_MAX_MSG_COUNT        20

struct mq_attr mqAttr;
mqAttr.mq_maxmsg = MQ_MAX_MSG_COUNT;
mqAttr.mq_msgsize = MQ_MAX_MSG_SIZE;

mq_unlink(MQ_TEST_PATH);

mode_t mode =  S_IRUSR | S_IWUSR;
int oflags = O_WRONLY | O_CREAT | O_EXCL;

mqd_t mqd;
mqd = mq_open(MQ_TEST_PATH, oflags, mode, &mqAttr);

if(mqd < 0)
    perror("Error on open");
    qDebug()<<mqd;
    return 0;


mq_close(mqd);
mq_unlink(MQ_TEST_PATH);

输出:

Error on open: Invalid argument
-1 

【问题讨论】:

当 mq_open 的最后一个参数(队列属性)更改为 NULL 并且它可以工作。但我不知道消息大小和队列最大长度的默认值是什么。 【参考方案1】:

ma​​n mq_open

EINVAL O_CREAToflag 中指定,attr 不是 NULL,但 attr-&gt;mq_maxmsgattr-&gt;mq_msqsize 无效。这两个字段都必须大于零。在非特权进程(没有CAP_SYS_RESOURCE 能力)中,attr-&gt;mq_maxmsg 必须小于或等于msg_max 限制

ma​​n mq_overview

> /proc/sys/fs/mqueue/msg_max

msg_max 的默认值为 10。

【讨论】:

谢谢,这就是问题所在。请问您是如何从错误代码中获得err EINVAL 的。以及如何使我的项目具有 CAP_SYS_RESOURCE 功能?我对 linux 有点陌生。 使用 errno 全局变量在最近一次系统调用后获取错误。见 man errno, man perror。至于 CAP_SYS_RESOURCE 功能 - 你真的需要它吗?最好的解决方案可能是在分配队列属性之前检查当前限制(参见 man getrlimit)。如果您确实需要更改限制,请以特权用户身份在单独的脚本中进行。您可以将所需的值写入 /proc/sys/fs/mqueue/msg_max 和 /proc/sys/fs/mqueue/msgsize_max(参见 man mq_overview) getrlimit(RLIMIT_MSGQUEUE, ...) 似乎给出了队列占用的最大字节数。 /proc/sys/fs/mqueue/msg_max 给出了消息的最大大小,但我找不到从我的 C 程序中读取该值的合理方法。你?理想情况下,我会让用户设置消息大小,但将其限制为这个值。 sudo setcap cap_sys_resource+eip /path/to/your/elf - mq 上的大多数文档都没有提到这一点!

以上是关于POSIX 消息队列 - 打开时出错:参数无效的主要内容,如果未能解决你的问题,请参考以下文章

Posix消息队列相关函数

Posix消息队列

Posix消息队列

linux进程间通信之Posix消息队列

POSIX消息队列

Posix消息队列