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>
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>