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】:man mq_open
EINVAL
O_CREAT
在oflag
中指定,attr
不是NULL
,但attr->mq_maxmsg
或attr->mq_msqsize
无效。这两个字段都必须大于零。在非特权进程(没有CAP_SYS_RESOURCE
能力)中,attr->mq_maxmsg
必须小于或等于msg_max
限制
man 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 消息队列 - 打开时出错:参数无效的主要内容,如果未能解决你的问题,请参考以下文章