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