Newsgroup: it.comp.os.linux.development
Titolo: pipe e processi

Salve a tutto il NG ,
forse sono un po' OT dato che non si tratta di sviluppo software LINUX
ma , sto tendando di risolvere un esercizio di  uno scorso appello
dell'università di C in ambiente *NIX ma purtroppo ho qualche problema
nell'implementarlo...  :(   , non nell' implementazione delle syscall
, ma proprio nella "strutturazione" del programma .
Il compito è il seguente :
- Devo fare 1 processo padre e 2 processi figli tramite la fork()
- Devo creare 2 pipe;
- il padre deve inviare nella pipe1 10 char uno per volta , char che
  possono assumere valore 'B' oppure 'C' (da un array preimpostato di
  10 elem.
  ex : char lettere[10] = {'B','B','N','B','N','N','N','B','N','B'} )
- i figli leggono da tale pipe e se riconoscono la propria lettera la
  "prendono" , altrimenti la reiviano al padre tramite la pipe2.
- il programma finisce quando i figli hanno le 5 lettere
io "pensavo" in pseudocodice :
int main(void) {
...
pipe(pipe1);
pipe(pipe2);
fork() //creo 1° figlio
if(figlio)
  {
   /* figlio 1 */
  }
   else
  {
 /* padre */
 fork() //creo 2° figlio
 if(figlio2)
     {
      /* figlio 2 */
      }
  /* ancora padre */
  //close(pipe1[READ]);
  //CICLO FOR
  //write(pipe1[WRITE],lettere[i],1);
  // wait()
   //close(pipe2[WRITE]);
  //read(pipe2[READ] , car , 1);
  //printf("padre riceve lettera non voluta da figlio %c\n",car);
  //??? che ne faccio di 'sta lettera 
  // tengo dei contatori che fino a quando il padre
   // non esaurisce le 10 lettere le rimette in pipe ??
   // quindi il for non va bene ....
  //FINE FOR
} //fine main()
Di conseguenza i figli che ciclo devono fare?
così potrebbe andare ?
while(lettera != 5) 
{
 leggo da pipe1
 non è la lettera attesa
write su pipe2 lettera non attesa
}
ma a questo punto come sincronizzo i 3 processi ...
ho bisogno di signal e kill (segnali x sincronizzarsi) ?
spero che qualcuno possa darmi qualche indicazione utile su come posso
strutturare il programma e aiutarmi a limitare i danni della mia
incapacità  :P .
grazie a tutti x l'eventuale aiuto

 ho bisogno di signal e kill (segnali x sincronizzarsi) ?
Frencamente non credo tu debba farlo. E` sempre difficile capire cosa vuole 
un esercizio, ma presumo che le lettere che il padre riceve indietro debba 
semplicemente rimandarle sulla pipe. 
In questo caso devi solo far conto sulla casualita` dell'esecuzione dei 
processi che fa si che alla fine ciascuno riesca a togliere dal circolo 
delle due pipe le lettere che gli spettano. Dovrebbe essere un giochino 
carino vedere come avviene il ciclo delle letture e lo svuotamento del 
circolo.
Ciao
Simone

Ho però ehm ... un piccolo problemino nel far comunicare i processi.
Infatti , tralasciando l'esercizio menzionato nel post precedente ,
non riesco a far comunicare tramite pipe 2 processi che si inviano
"messaggi" tramite iterazione ..
ti (vi) posto un pochino di codice per meglio comprendere :
int temp=1;
int pipe1[2];
...
if((pipe(pipe1))<0) {perror("errore su pipe1"); exit(0);}
.......
PROCESSO FIGLIO
    while(temp != 5)
      {
      close(pipe1[WRITE]);
      if((read(pipe1[READ], &buff,1)) != -1){
      if(buff=='B')temp=temp+1;
      printf("figlio riceve il %d lettera B\n",temp); }
      }  
PROCESSO PADRE :
for(i=0;i<10;i++)
       {
       sleep(1);
       close(pipe1[READ]);
       write(pipe1[WRITE],lettera[i],1);
       printf("padre invia %c \n",lettera[i]);       
       }
  exit(4);
Come probabilmente noterai ( noterete ) ci deve essere un principio di
fondo che non capisco .... quando il passaggio di messaggi in pipe è
iterativo .....
Se il passaggio è "statico" si fa :
PROC PADRE
close(pipe1[READ]);
write(pipe1[WRITE],MESSAGGIO,LENGTH_MESSAGGIO);
close(pipe1[WRITE]);
wait(&status);
sleep(1);
printf("padre ha finito \n");
exit(0); 
PROC FIGLIO
close(pipe1[WRITE]);
read(pipe1[READ],&buff,LENGTH_MESSAGGIO);
close(pipe1[READ]);
sleep(2);
printf("nipote riceve : %s \n",bufn);
printf("nipote ha finito\n");
exit(4);
Spero che sappiate "illuminarmi" almeno un po' ...  :D
altrimenti non ce ne esco fuori ...  :(
Grazie e ciao

 altrimenti non ce ne esco fuori ...  :(
Si ma se non dici in che senso non ti funziona ...