2012-12-18 37 views
4

我在linux上创建消息队列时遇到问题。我收到的错误是“无效的参数”。我需要的另一件事是代码是Qt项目的一部分。POSIX消息队列 - 打开时出错:无效参数

常见的错误是名称不以(/)开头,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 
+0

当mq_open的最后一个参数(队列属性)更改为NULL并且它工作时。但我不知道msg大小和队列最大长度的默认值。 – DimDqkov

回答

7

人mq_open

EINVALO_CREAToflag指定,并attr不是NULL,但是attr->mq_maxmsgattr->mq_msqsize无效。这两个字段必须大于零。在一个过程,是无特权的(不具有CAP_SYS_RESOURCE能力),attr->mq_maxmsg必须小于或等于msg_max极限

人mq_overview

> 的/ proc/SYS/FS/mqueue中/ msg_max

为msg_max的默认值是10。

+0

谢谢,这是问题所在。我可以问你,你是如何从错误代码中得到错误EINVAL的。我怎样才能让我的项目具备CAP_SYS_RESOURCE功能?我对Linux很陌生。 – DimDqkov

+0

使用** errno **全局变量在最近的系统调用后出现错误。见男人errno,男人perror。至于CAP_SYS_RESOURCE功能 - 你真的需要它吗?可能最好的解决方案是在分配队列属性之前检查当前的限制(请参阅man getrlimit)。如果您确实需要更改限制,请将其作为特权用户在单独的脚本中执行。您可以将所需的值写入/ proc/sys/fs/mqueue/msg_max和/ proc/sys/fs/mqueue/msgsize_max(参见man mq_overview) –

+1

'getrlimit(RLIMIT_MSGQUEUE,...)'似乎给出了最大数目队列占用的字节数。 '/ proc/sys/fs/mqueue/msg_max'给出了消息的最大尺寸,但是我找不到从我的C程序中读取这个值的合理方法。你做?理想情况下,我会让用户设置邮件大小,但将其限制为此值。 – Gauthier