gpt4 book ai didi

c - IPC 队列消息错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:05 25 4
gpt4 key购买 nike

这是一个将消息发送到队列的简单程序,但输出为“snd error”。队列已创建。我用 ipcs -q 检查过。我做错了什么?

#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/types.h>
#include<stdlib.h>
struct msg{
int mtype;
char mtext[1024];

}snd;
void main()
{
int id;
if(id=msgget(1234,IPC_CREAT|0666)<0)
{
printf("ipc error");
}
else{
snd.mtype=1;
scanf("%[^\n]",snd.mtext);
getchar();

if(msgsnd(id,&snd,sizeof(snd.mtext),IPC_NOWAIT)<0){
printf("snd error");
}
else {
printf("msg snd");
}

}

}

最佳答案

What have i done wrong?

您检查 msgsnd 的返回码,这很好,这意味着您已经领先于许多程序员。但是您还没有阅读 msgsnd 的整个手册, 说明

RETURN VALUE
On failure both functions return -1 with errno indicating the error,

哪里 errno 是重要的部分。

当您进一步查看时,还有一个名为 ERRORS 的部分,它显示了可能出错的地方

ERRORS
When msgsnd() fails, errno will be set to one among the following values:

  EACCES The calling process does not have write permission on the
message queue, and does not have the CAP_IPC_OWNER capability.

EAGAIN The message can't be sent due to the msg_qbytes limit for the
queue and IPC_NOWAIT was specified in msgflg.

...

再往下,您会找到一个示例部分

EXAMPLE

  The program below demonstrates the use of msgsnd() and msgrcv().  

...

msgsnd 的用法显示一个重要的成语:当发生错误并且在errno中报告具体错误时,此错误可能由 perror 打印

if (msgsnd(qid, (void *) &msg, sizeof(msg.mtext),
IPC_NOWAIT) == -1) {
perror("msgsnd error");
exit(EXIT_FAILURE);
}

perror将显示一条消息,详细说明对 msgsnd 的调用出了什么问题.这也可以与任何其他系统调用一起使用。


根据手册“无效参数”(EINVAL)表示其中之一

EINVAL msqid was invalid, or msgsz was less than 0.
EINVAL (since Linux 3.14) msgflg specified MSG_COPY, but not IPC_NOWAIT.
EINVAL (since Linux 3.14) msgflg specified both MSG_COPY and MSG_EXCEPT.

因为您没有指定 MSG_COPY ,错误必须是第一个。

  • msgsz肯定大于0
  • 所以它一定是一个无效的msqid!

当你看着

if(id = msgget(1234, IPC_CREAT | 0666) < 0)

您会看到 (id = msgget(...)) 周围缺少括号.最有可能 msgget返回值 > 0,所以 msgget(...) < 0为false,id会变成0(false),走else分支。

因此,调用 msgsnd(0, ...)很可能是错误的罪魁祸首。


要解决这个问题,要明确

id = msgget(1234, IPC_CREAT | 0666);
if (id < 0) {
...
} else {
...
}

或者至少在作业周围加上括号

if ((id = msgget(1234, IPC_CREAT | 0666)) < 0) {

关于c - IPC 队列消息错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40385737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com