msgrcv:无效的参数错误
问题描述:
我得到一个错误,指出:msgrcv:无效的参数错误
msgrcv:无效的参数
这可能是造成这个错误?这里是我的代码
卑鄙我从家长传递消息给孩子,然后我想从孩子传递消息给父母,即使我使用基本上相同的代码为两者,它不是没有为第二次接收工作。
struct msg {
long int mtype; /* message type */
char mtext[1024]; /* message text */
} msg;
int len, msgflg = 0, msqid, *pint;
pid_t pid;
size_t msgsz = 40;
long int msgtyp;
msqid = msgget(IPC_PRIVATE,S_IRWXU);
char* charpid[250];
msg.mtype = 1;
if (msqid < 0) {
perror("msgget");
exit(1);
}
switch(pid=fork()) //fork child process
{
case 0: //Child process
//receive message from parent
if(msgrcv(msqid,&msg,sizeof msg.mtext, 1,IPC_NOWAIT)>=0){
printf("Serving for client pid #%s",msg.mtext);
asprintf(&charpid[0], "%ld\n", pid);
strncpy(msg.mtext,charpid[0], 1024);
if(msgsnd(msqid,&msg,strlen(msg.mtext),msgflg)<0){
perror("msgsnd");
}
}
else
perror("msgrcv");
msgctl(msqid, IPC_RMID, NULL);
exit(0);
case -1:
printf("fork failed");
exit(2);
break;
default:
//convert pid to string.
asprintf(&charpid[0], "%ld\n", pid);
//set mtext
strncpy(msg.mtext,charpid[0], 1024);
//send message
if(msgsnd(msqid,&msg,strlen(msg.mtext),msgflg)<0){
//report error
perror("msgsnd");
}
//wait for child process to die
wait(NULL);
//receive message from child
if(msgrcv(msqid,&msg,sizeof msg.mtext, msg.mtype,IPC_NOWAIT)>=0){
//print pid
printf("Received reply from pid #%s",msg.mtext);
}
else
//report error
perror("msgrcv");
exit(0);
}
答
“无效参数”错误来自您的原始进程(而不是分叉的子进程),并在尝试从子进程接收回复时发生。发生此错误的原因是该孩子已经在此之前删除了该队列。由于您的原始流程创建了队列并等待孩子退出,因此在收到答复后删除队列会更有意义。
即使你解决这个问题,你还可以发现,当孩子不其msgrcv
它可能无法得到任何东西,因为你原来的进程可能没有发送它,但(和你指定IPC_NOWAIT
)。为了使您的代码正常工作,对于两个接收者,我必须如上所述移动msgctl
呼叫,并且还要在儿童的msgrcv
之前添加sleep
呼叫。