mq_open的地址错误

时间:2015-05-03 08:58:29

标签: c posix ipc

我正在尝试使用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;
}

2 个答案:

答案 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设置的值)