C - почему этот msgsend работает, а другой не получает? - PullRequest
0 голосов
/ 11 апреля 2020

Я изучаю unix сообщений, у меня проблема в этой программе, вы можете мне помочь? Процесс отправляет сообщение, другой процесс получает его и создает поток для ответа. Клиент msgsnd работает, а работник получает, но клиент останавливается на его msgrcv.

Я не могу найти ошибку, надеюсь, вы можете мне помочь, я оставляю свой код здесь: в основном есть только fork и join и msgget для их идентификатора.

//id_andata is the in mailbox
//id_ritorno is the out mailbox
void client(){

    srand(getpid());
    messaggio msg; //message in 
    risposta  ris; //message out 
    int ret; 

    for(int i=0;i<5;i++){
        msg.msg1 = rand()%101; 
        msg.msg2 = rand()%101; 
        msg.tipo = getpid();

        ret = msgsnd(id_andata,&msg,sizeof(messaggio)-sizeof(long),0);
        if(ret < 0) perror("[CLIENT] Errore send");
            printf("[CLIENT %d] ho inviato: %d %d \n",getpid(),msg.msg1,msg.msg2);

        ret = msgrcv(id_ritorno,(void*)&ris,sizeof(risposta)-sizeof(long),getpid(),0);
        if(ret < 0) perror("[CLIENT] Errore recever");
            printf("[CLIENT %d] ho ricevuto: %d \n",getpid(),ris.msg); 
    }
}

void server(){

    pthread_mutex_init(&mutex,NULL);

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

    while(1){
        messaggio* msg = (messaggio*)malloc(sizeof(messaggio));
        msg->msg1 = 0; msg->msg2 = 0; msg->tipo = 0;

        int ret = msgrcv(id_andata,msg,sizeof(messaggio)-sizeof(long),0,0);
        if(ret < 0){
            perror("[server] errore ricezione");
            exit(1);        
        }
            pthread_t t;
            pthread_create(&t,&attr,worker,(void*)msg);
        }
    }

}

void* worker(void* M){
    messaggio* msg = (messaggio*)M;
    risposta  ris;

    ris.msg = msg->msg1 + msg->msg2;
    ris.tipo = msg->tipo;

    pthread_mutex_lock(&mutex);
        int ret = msgsnd(id_ritorno,(void*)&ris,sizeof(risposta)-sizeof(long),0);
        if(ret <0){
            perror("[WORKER] errore invio");
            exit(1);
        }else printf("[worker] invio: %d %li \n", ris.msg, ris.tipo);
    pthread_mutex_unlock(&mutex);

    free(msg);
    pthread_exit(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...