8

我在 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 
4

1 回答 1

13

人 mq_open

EINVAL O_CREAT 在 中指定 oflag,但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。

于 2012-12-18T09:16:16.173 回答