Ciao a tutti,
in questi giorni sto svolgendo un esercizio sulla comunicazione tra processi con pipes, il cui testo è il seguente (scusate l'inglese):
Write a program which creates three child process P1, P2 and P3, and pipes between the processes.
Then P1 is to write a message to P2 who passes it to P3 who then passes it to P1, and so on.
Each time P1 receives the message he changes it.
Ho provato a svolgerlo in questo modo, ma mi dicono che è sbagliato.
Potreste darmi una mano? Grazie in anticipo!
codice:
#include <stdio.h>
int main()
{
int fdes[2]; // prima pipe
int fdes2[2]; // seconda pipe
int fdes3[2]; // terza pipe
int pid; // usato per controllo nel fork
int pid2; // usato per controllo nel fork
int pid3; // usato per controllo nel fork
char *messaggio = "sis" ; // primo messaggio
char *messaggio2 = "op"; // secondo messaggio
int i=0;
char singolo; // singolo carattere
char buffer1[5]; // buffer tra processi
char buffer2[6]; // buffer tra processi
char buffer3[7]; // buffer tra processi
pipe(fdes); // creazione prima pipe
pipe(fdes2); // creazione seconda pipe
pipe(fdes3); // creazione terza pipe
pid=fork(); // processo A
if(pid != 0) // se è il padre
{
wait(); //aspetto
close(fdes[1]); // chiudo la pipe fdes in scrittura poichè prima devo leggere
while (singolo !='\0') { // fino a che non ho letto tutto il messaggio
singolo = read(fdes[0],1,sizeof(char)) ; // leggo ogni carattere
buffer1[i] = singolo; // metto il carattere letto nel buffer
i = i + 1; // incremento il contatore per cambiare l 'indice del buffer
}
// ora che ho letto il mio messaggio apro la pipe in scrittura verso il secondo processo
open(fdes[1]); // pipe fdes aperta in scrittura. posso quindi passare il messaggio a B
pid2=fork(); // processo B
if(pid2 != 0) // se è il padre
{
wait(); //aspetto
close(fdes2[1]); // chiudo la pipe fdes2 in scrittura poichè prima devo leggere
while (singolo !='\0') { // fino a che non ho letto tutto il messaggio
singolo = read(fdes2[0],1,sizeof(char)) ; // leggo carattere per carattere
buffer2[i] = singolo; // metto il carattere letto nel buffer
i = i + 1; // incremento il contatore per cambiare l 'indice del buffer
}
open(fdes2[1]); // pipe fdes2 aperta in scrittura. posso quindi passare il messaggio a C
pid3=fork(); // processo C
if(pid3 != 0) // se è il padre
{
wait(); //aspetto
close (fdes3[1]); // chiudo la pipe fdes3 in scrittura poichè prima devo leggere
while (singolo !='\0') { // finchè non ho letto tutto il messaggio
singolo = read(fdes3[0],1,sizeof(char)) ; // leggo ogni carattere
buffer3[i] = singolo; // metto il carattere letto nel buffer
i = i + 1; // incremento il contatore per cambiare l 'indice del buffer
}
open(fdes3[1]); // pipe fdes3 aperta in scrittura verso A
*messaggio = *messaggio2; // cambio il messaggio
}
else // sono nel proc C
{
write(fdes3[1],buffer2,sizeof(buffer2));
}
}
else // sono nel processo B
{
write(fdes2[1],buffer1,sizeof(buffer1));
}
}
else //sono nel processo A
{
write(fdes[1],messaggio,sizeof(messaggio));
}
}