|
|
|
|
Strumenti |
25-06-2017, 20:41 | #1 |
Junior Member
Iscritto dal: Jun 2017
Messaggi: 4
|
Pipe vuota
Salve
Ho un problema con questo codice, in particolare con la lettura della pipe. In pratica ho un processo padre e n processi figli. Il padre deve mandare tramite pipe gli indici di una matrice e ciascun figlio deve leggerli. Il padre li manda correttamente, ma facendo un controllo sulla pipe mi risulta vuota. Sto impazzendo per capire dove sbaglio: Posto codice: <code> /*Creazione Pipe*/ if(pipe(to_chil) == -1) { perror("pipe"); exit(1); } if(pipe(operazione) == -1) { perror("pipe"); exit(1); } printf("Processo padre: pipe creata\n"); //Esecuzione NProcessi per il prodotto for(j=0; j<numeroprocessi; j++){ if ((pid[j]=fork()) == 0){ for(k=0;k<noperazioni;k++){ usleep(500); switch(c=read(to_chil[0],buf,sizeof(buf))){ case -1: printf("buff=%d %d\n", buf[0],buf[1]); perror("read"); exit(1); case 0: printf("PID:%d pipe empty\n",getpid()); sleep(1); break; default: printf("ho letto: %d %d\n",buf[0],buf[1]);} } //close(to_chil[0]); return(101+i); } else{ for(i=0; i<n;i++){ buf[0]=j; buf[1]=i; switch(r= write(to_chil[1],buf,sizeof(buf))){ case -1: printf("buff=%d %d\n", buftest[0], buftest[1]); perror("write"); exit(1); case 0: printf("pipe empty\n"); sleep(1); break; default: printf("ho scritto: %d %d\n",buf[0],buf[1]); } usleep(5000000*(1+j));} } } int l; //Attende che processi terminino for(l=0;l<numeroprocessi;l++) { int status; wait(&status); // Attende termine di un figlio (uno qualunque) printf("Terminato processo %d\n",WEXITSTATUS(status));} close(to_chil[1]); close(operazione[1]); </code> |
26-06-2017, 16:15 | #2 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3305
|
Continui a riproporre la stessa domanda a cui hai già avuto risposta 20 giorni fa
Hai studiato un minimo come funzionano le pipe? Le pipe non possono essere usate come le stai usando te. Puoi o usare i socket o creare una pipe dedicata ad ogni client. |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:57.