msgrcv:参数无效错误

时间:2011-10-03 02:59:08

标签: c message

我收到的错误是:

msgrcv:参数无效

可能导致此错误的原因是什么?这是我的代码

Bassically我将一条消息从父母传递给一个孩子,然后我想将一条消息从孩子传递给父母,即使我对两者使用基本相同的代码,也不是&# 39;为第二次接收工作。

    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);
}

1 个答案:

答案 0 :(得分:4)

“无效参数”错误来自原始进程(不是分叉子进程),并且在尝试接收来自子进程的回复时发生。发生此错误是因为该子项已经删除了该队列。由于您的原始进程创建了队列并等待子进程退出,因此在那里删除队列更有意义(在收到回复后)。

即使您解决了这个问题,您仍然可能会发现,当孩子执行其msgrcv时,它可能无法获得任何内容,因为您的原始流程可能尚未发送它(并且您指定IPC_NOWAIT)。为了使您的代码能够正常运行,我必须按照上面的说明移动msgctl来电,并在孩子的sleep之前添加msgrcv来电。