C语言 为什么errno设置为22:mq_打开()POSIX

ycggw6v2  于 2023-01-16  发布在  其他
关注(0)|答案(2)|浏览(363)

当我试图用C在POSIX中创建一个消息队列时,我收到了错误号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);
    }

编辑:很抱歉没有说得更清楚。错误号22是无效参数。--错误号的含义可以在errno. h上找到

xhv8bpkk

xhv8bpkk1#

我假设您在Linux上使用的是mq_open(3),而errno得到的是EINVAL。根据文档,这可能发生在以下情况:
名称不符合mq_overview(7)中的格式。

在oflag中指定了O_CREAT,attr不为NULL,但attr-〉mq_maxmsg或attr-〉mq_msqsize无效。这两个字段都必须大于零。在非特权进程中(不具有CAP_SYS_RESOURCE功能),属性-〉mq_maxmsg必须小于或等于msg_max限制,属性-〉mq_msgsize必须小于或等于msgsize_max限制。此外,即使在特权进程中,attr-〉mq_maxmsg也不能超过HARD_MAX限制。2(有关这些限制的详细信息,请参阅mq_overview(7))
因此,您还应该读取mq_overview(7)
下一次,在错误情况下使用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);
}
8xiog9wr

8xiog9wr2#

嗯,对我来说,这是一个丢失的正斜杠“/”的名称,导致errno 22。

相关问题