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呼叫。