Я изучаю 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);
}