PDA

View Full Version : Pipe vuota


andrea2296
25-06-2017, 20:41
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>

tomminno
26-06-2017, 16:15
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.