当我试图用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上找到
2条答案
按热度按时间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)的返回值,在您的情况下:
8xiog9wr2#
嗯,对我来说,这是一个丢失的正斜杠“/”的名称,导致errno 22。