msgrcv: Неверный аргумент Ошибка - PullRequest
1 голос
/ 03 октября 2011

Я получаю сообщение об ошибке:

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

1 Ответ

4 голосов
/ 03 октября 2011

Ошибка «Недопустимый аргумент» произошла от вашего исходного процесса (не разветвленного потомка) и возникает, когда он пытается получить ответ от потомка. Ошибка происходит, потому что ребенок уже удалил очередь к тому времени. Поскольку ваш исходный процесс создал очередь и в любом случае ожидает выхода дочернего элемента, было бы более целесообразно удалить эту очередь (после получения ответа).

Даже если вы исправите это, вы все равно можете обнаружить, что когда child делает msgrcv, оно может ничего не получить, поскольку ваш исходный процесс еще не отправил его (и вы указываете IPC_NOWAIT). Чтобы заставить ваш код работать с обоими получателями, мне пришлось переместить вызов msgctl, как отмечено выше, а также добавить вызов sleep перед msgrcv в дочернем элементе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...