I'm trying to implement a program which take a sequence of parameter in the input and depending in that it create an equal number of processes implemented by pipes ,where each process write in the pipe and then pass it to the father .
here is my code ,it doesn't do what i need .
thank you for help .
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <string.h> int main(int argc ,char *argv[]) { int i,pid; int fd[2];//crea i descriptor char phrase[30][30];//crea il buffer pipe(fd); /* crea la pipe */ // Genera i 10 processi for(i=0;i<argc-1;i++) { if((pid=fork())==0) { strcpy(phrase[i], argv[i+1]); printf("ho scritoo :'%s'\n",*phrase); close(fd[0]); /* chiude in lettura */ write(fd[1],phrase,strlen(*phrase)+1); /* invia anche 0x00 */ close (fd[1]); // chiude in scrittura // pid=0 -> figlio usleep(50000*(1+i)); // Ritardo iniziale printf("Figlio: %d\n",i+1); // Stampa messaggio del figlio usleep(500000*(1+i)); // Ritardo finale return(101+i); // Termina con codice di ritorno } else { printf("Ho generato il figlio %d con pid %d\n",i+1,pid); char message[100]; //creare il buffer memset(message,0,100); int bytesread; close(fd[1]); /* chiude in scrittura */ bytesread = read(fd[0],message,sizeof(message)); printf("ho letto dalla pipe %d bytes: '%s' \n",bytesread,message); close(fd[0]); } } // Attende che dieci processi terminino for(i=0;i<argc-1;i++) { int status; wait(&status); // Attende termine di un figlio (uno qualunque) printf("Terminato processo %d\n",WEXITSTATUS(status)); } } Input : ./pipes cmd1 cmd2 cmd3
I created the first child with pid 21552 I wrote: 'cmd1' I read from the pipe 5 bytes: 'cmd1' I created the second child with pid 21553 I read from the pipe -1 bytes:'' I wrote: ') ML?' I created the third child with pid 21554 I read from the pipe -1 bytes:'' I write: ') ML?' Son: 1 Son: 2 Son: 3 Ended process 101 Ended process 102 Ended process 103