簡體   English   中英

msgrcv:參數無效錯誤

[英]msgrcv: Invalid argument Error

我收到的錯誤是:

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中的msgrcv之前添加一個sleep調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM