Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么将errno设置为22:mq_open()POSIX_C_Posix_Message Queue - Fatal编程技术网

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

C 为什么将errno设置为22:mq_open()POSIX,c,posix,message-queue,C,Posix,Message Queue,当试图用C在POSIX中创建消息队列时,我收到错误22。 据我所知,通过与web上可用的示例代码进行比较,我已经正确设置了参数 以下是一个片段: 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", &

当试图用C在POSIX中创建消息队列时,我收到错误22。 据我所知,通过与web上可用的示例代码进行比较,我已经正确设置了参数

以下是一个片段:

    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是无效参数。 --错误号的含义可以在errno.h

上找到,我假设您在Linux上使用,并且
errno
获取
EINVAL
。根据文件,在以下情况下可能发生:

名称不符合mq_概述(7)中的格式

O_CREAT在oflag中指定,attr不为NULL,但 attr->mq_maxmsg或attr->mq_msqsize无效。两者 这些字段必须大于零。在这个过程中 无特权(不具备CAP_系统资源能力), attr->mq_maxmsg必须小于或等于msg_max 限制,并且attr->mq_msgsize必须小于或等于 msgsize_最大限制。此外,即使是在特权程序中, attr->mq_maxmsg不能超过硬最大限制。(见 mq_概述(7)了解这些限制的详细信息。)

所以你也应该阅读

顺便说一句,阅读手册总是比在这里这样的论坛上提问更快

下次,在错误情况下使用。请注意,POSIX规范没有将数值分配给错误号,如
EINVAL
(这是故意的,几个符合POSIX的系统可能有不同的数字)

顺便说一句,您应该始终检查的返回值,在您的情况下:

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);
}
printf(“从1到400,N是什么?:\N”);
n=0;

如果(scanf(“%d”,&n)对我来说,是名称中缺少正斜杠“/”导致了错误号22。

perror()检查错误号所指的内容
。您可以在errno.h上查找errno的含义。使用perror会得出相同的结论:错误22:无效参数>我试图找出我的参数无效的原因。我不记得在没有perror的情况下在哪里找到了errno@WilliamPursell@Chris:我们无法在您的机器上查看
errno.h
——POSIX中没有任何内容显示“err”22号应该是EINVAL-无效参数。因此,您必须为我们翻译;您可以访问您的机器并执行此操作。因此,errno.h在不同的机器之间可能不同?这是我也不知道的。我发现的每个显示errno.h内容的网页都是相同的。
errno.h
在d上可能不同不同的操作系统。在SunOS4/Sparc上可能与Linux/x86-64和IIRC上不同。在Linux/ARM和Linux/x86-64上可能不同