我正在尝试使用mq_open打开一个简单的队列,但我一直收到错误:
"Error while opening ...
Bad address: Bad address"
我不明白为什么。
int main(int argc, char **argv) {
struct mq_attr attr;
//max size of a message
attr.mq_msgsize = MSG_SIZE;
attr.mq_flags = 0;
//maximum of messages on queue
attr.mq_maxmsg = 1024 ;
dRegister = mq_open("/serverQRegister",O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR,0664, &attr);
if(dRegister == -1)
{
perror("mq_open() failed");
exit(1);
}
}
我按建议更新了代码,但仍然收到错误("无效的参数"):
#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include "serverDefinitions.h"
mqd_t dRegister;
int main(int argc, char **argv) {
struct mq_attr attr;
//setting all attributes to 0
memset(&attr, 0, sizeof attr);
//max size of a message
attr.mq_msgsize = MSG_SIZE; //MSG_SIZE = 4096
attr.mq_flags = 0;
//maximum of messages on queue
attr.mq_maxmsg = 1024;
dRegister = mq_open("/serverQRegister", O_RDONLY | O_CREAT, 0664, &attr);
if (dRegister == -1) {
perror("mq_open() failed");
exit(1);
}
return 0;
}
答案 0 :(得分:2)
此次电话
... = mq_open("/serverQRegister",O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR,0664, &attr);
指定了太多参数。 mode
似乎已经指定了两次。
应该是
... = mq_open("/serverQRegister",O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR, &attr);
或
... = mq_open("/serverQRegister",O_RDONLY | O_CREAT, 0664, &attr);
关于EINVAL,man mq_open
州:
EINVAL
在oflag中指定了O_CREAT ,并且attr不是NULL,但是 attr-&gt; mq_maxmsg 或 attr-&gt; mq_msqsize 无效。这两个字段都必须大于零。在没有特权的过程中(没有 CAP_SYS_RESOURCE 功能), attr-&gt; mq_maxmsg 必须小于或等于 msg_max 限制, attr-&gt; mq_msgsize 必须小于或等于msgsize_max限制。此外,即使在特权过程中, attr-&gt; mq_maxmsg 也不能超过 HARD_MAX 限制。 (有关这些限制的详细信息,请参阅mq_overview(7)。)
attr
的初始化达到了mq_maxmsg
或/和mq_msgsize
中的一个或两个的限制。阅读man 7 mq_overview
了解如何找出限制。
答案 1 :(得分:2)
mq_open()是一个varadic函数,可以使用2个或4个参数,但你给它5,这是错误的。
让它只是
dRegister = mq_open("/serverQRegister",O_RDONLY | O_CREAT, 0664, &attr);
或使用符号名称S_IRUSR | S_IWUSR而不是八进制表示。
您还应初始化attr
的所有成员,如果您提供mq_attr,则必须同时设置mq_msgsize和mq_maxmsg,因此请将其设为
struct mq_attr attr;
memset(&attr, 0, sizeof attr);
//max size of a message
attr.mq_msgsize = MSG_SIZE;
attr.mq_maxmsg = 10;
(注意,mq_maxmsg必须小于命令sysctl fs.mqueue.msg_max
设置的值)