为什么errno设置为22:mq_open()POSIX

时间:2015-04-01 03:52:03

标签: c posix message-queue


我在尝试使用C在POSIX中创建message_queue时收到错误22。 据我所知,通过与网上提供的示例代码进行比较,我已正确设置参数。

这是一个片段:

    int open_flags;
    mqd_t mqfd;
    int bytes_per_msg;
    struct mq_attr attr;
    unsigned int* msgbuff;

    printf("from 1 to 400, what is N? : ");
    scanf("%d", &n);
    bytes_per_msg = (n + 1) * (sizeof(unsigned int));
    msgbuff = (unsigned int*)malloc(bytes_per_msg);

    open_flags = O_CREAT|O_RDWR;
    attr.mq_maxmsg = n;
    attr.mq_msgsize = bytes_per_msg;
    attr.mq_flags   = 0;


    mqfd = mq_open("/myqueue", open_flags, 0666, &attr);

    if(mqfd == -1){
        printf("queue creation failed, ERRNO: %d\n",errno);
    }
编辑:我为不太清楚而道歉。 Errno 22是INVALID ARGUMENT。 - 错误号的含义可以在errno.h上找到

2 个答案:

答案 0 :(得分:4)

我假设您在Linux上使用mq_open(3)errno获取EINVAL。根据文档,它可能发生在:

  

名称不遵循mq_overview(7)中的格式。

  

在oflag中指定了O_CREAT,并且attr不是NULL,但是      attr-> mq_maxmsg或attr-> mq_msqsize无效。两者的                 这些字段必须大于零。在一个过程中                 无特权(没有CAP_SYS_RESOURCE功能),                 attr-> mq_maxmsg必须小于或等于msg_max                 limit和attr-> mq_msgsize必须小于或等于                 msgsize_max限制。此外,即使在特权过程中,                 attr-> mq_maxmsg不能超过HARD_MAX限制。 (看到                 mq_overview(7)了解这些限制的详细信息。)

所以你也应该阅读mq_overview(7)

BTW,RTFM总是比在这里的某个论坛上要求更快。所以你已经失去了你和我们的时间。

下次,在错误情况下使用perror(3)。请注意,POSIX errno.h规范没有为EINVAL等错误号分配数值(这是故意的,有几个POSIX兼容系统可能有不同的数字)。

顺便说一下,在你的情况下,你应该总是检查scanf(3)的返回值:

printf("from 1 to 400, what is N? : \n");
n= 0;
if (scanf("%d", &n)<1 || n<=0 || n>400) { 
  fprintf(stderr, "bad number (n=%d)\n", n);
  exit(EXIT_FAILURE);
}

答案 1 :(得分:1)

对我而言,这是一个缺失的正斜线&#34; /&#34;在名义上导致了errno 22。