Scrivere un programma C che prenda come parametri il nome di 4 file. Il
programma dovrà creare 3 processi figlio. Ogni figlio leggerà dal proprio file tre
caratteri comunicandoli al padre tramite PIPE. Il padre controllerà i caratteri letti,
se la sequenza di 3 caratteri ricevuta dai 3 figli risulterà la medesima questa
verrà stampata nel quarto file. Non appena uno dei figli terminerà la lettura del
suo file, tutti gli altri processi figlio dovranno anche questi terminare.
io l'ho fatto in questo modo , però non so dopo come tornare ai figli e far continuare a scrivere sulla pipe e poi ritornare ancora al padre vi prego qualcuno sa aiutarmi?
#include <sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char **argv){
if(argc<4){
perror("errore nel passaggio di parametri");
exit(1);
}
int filedes[2],filedes2[2],filedes3[2],fd,fd2,fd3,fd4,i,status,n,flag=0;
pid_t pid[3];
char a[4],b[4],c[10];
if(pipe(filedes)<0){
perror("errore della prima pipe");
exit(1);
}
if(pipe(filedes2)<0){
perror("errore della seconda pipe");
exit(1);
}
if(pipe(filedes3)<0){
perror("errore della terza pipe");
exit(1);
}
for(i=0;i<3;i++){
pid[i]=fork();
if(pid[i]<0){
perror("errore di fork");
exit(1);
}
if(pid[i]==0){
if(i==0){
printf("figlio 1 in azione\n");
close(filedes[0]);
if((fd=open(argv[1],O_RDONLY))<0){
perror("errore di apertura del primo file");
exit(1);
}
if(read(fd,a,3)<0){
perror("errore di lettura sul primo file");
exit(1);
}
if(write(filedes[1],a,3)<0){
perror("errore di scrittura sulla prima pipe");
exit(1);
}
close(fd);
}
else if(i==1){
printf("figlio 2 in azione\n");
close(filedes2[0]);
if((fd2=open(argv[2],O_RDONLY))<0){
perror("errore di apertura del secondo file");
exit(1);
}
if(read(fd2,b,3)<0){
perror("errore di lettura sul secondo file");
exit(1);
}
if(write(filedes2[1],b,3)<0){
perror("errore di scrittura sulla seconda pipe");
exit(1);
}
close(fd2);
}
else if(i==2){
printf("figlio 3 in azione\n");
close(filedes3[0]);
if((fd3=open(argv[3],O_RDONLY))<0){
perror("errore di apertura del terzo file");
exit(1);
}
if(read(fd3,c,3)<0){
perror("errore di lettura sul terzo file");
exit(1);
}
if(write(filedes3[1],c,3)<0){
perror("errore di scrittura sulla terza pipe");
exit(1);
}
close(fd3);
}
exit(0);
}
else{
wait(&status);
if(i==2){
close(filedes[1]);
close(filedes2[1]);
close(filedes3[1]);
if((fd4=open(argv[4],O_WRONLY))<0){
perror("errore di apertura del quarto file");
exit(1);
}
if((n=read(filedes[0],a,3))<0){
perror("errore di lettura dalla prima pipe");
exit(1);
}
if((n=read(filedes2[0],b,3))<0){
perror("errore di lettura dalla seconda pipe");
exit(1);
}
if((n=read(filedes3[0],c,3))<0){
perror("errore di lettura dalla terza pipe");
exit(1);
}
printf("prima stringa %s \n",a);
printf("seconda stringa %s \n",b);
printf("terza stringa %s \n",c);
if((strcmp(a,c))==0)
flag=1;
if(flag==1){
if((strcmp(a,b))==0){
if(write(fd4,a,3)<0){
perror("errore di scrittura sul quarto file");
exit(1);
}
}
}
}
}
}
exit(0);
}