我在尝试使用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上找到
答案 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)