#include #include #include #include #include #include #include /*Esame 11 Luglio 2012*/ /*Tipo di Dato pipe*/ typedef int pipe_t[2]; /*Dichiarazione Esplicita Funzione Figlio*/ int figlio(char *Fi,int indice); /*Variabili Globali*/ int K; /*Numero passato come ultimo Parametro*/ int N; /*Numero di file passati come parametri*/ int dim,retval; int pid;/*PID per creazione figli*/ char Fout[256];/*Nome file creato dal padre*/ int fdout;/*File decriptor file Fout*/ char Media[12];/*Stringa contenente la scritta Equal-Sopra-Sotto Media*/ char str[256];/*Stringa di appoggio per scrittura in stdout*/ pipe_t *pfd_p; pipe_t *pfd_f; /*NOTA:Si utilizzano 2N pipe !!*/ /*N pipe pfd_p per la comunicazione figli-padre*/ /*N pipe pfd_f per la comunicazione padre-figli*/ int main(int argc,char **argv ){ /*Variabili Locali*/ int i,st; long int cont_ch;/*Variabile long int per lettura da pipe pfd_f*/ /*Controllo numero parametri*/ dim=argc-1; if (dim<3){ snprintf(str,256,"USO scheletro F1 F2 FN M \n"); write(1,str,strlen(str)); return(1); } /*Controllo sul numero K*/ K=atoi(argv[dim]); if (K <= 0){ snprintf(str,256,"Inserire K intero strettamente positivo \n"); write(1,str,strlen(str)); return(2); } /*Creazione file Fout*/ snprintf(Fout,256,"output.%d",K); fdout=creat(Fout,0644); if (fdout<0){ snprintf(str,256,"Impossibile creare il file %s \n",Fout); write(1,str,strlen(str)); return(3); } /*Assegno Numero di figli*/ N=dim-1; /*Allocazione dinamica pipe pfd_p*/ pfd_p=(pipe_t*)malloc(sizeof(pipe_t)*N); if (pfd_p==NULL){ snprintf(str,100,"Errore allocazione pipe pfd_p \n "); write(1,str,strlen(str)); return(4); } /*Creazione Pipe pfd_p*/ for (i=0;iK){ /*Preparo la stringa Sopra Media per il figlio */ snprintf(Media,12,"Sopra Media"); } if (cont_ch==K){ /*Preparo la stringa Equal Media per il figlio */ snprintf(Media,12,"Equal Media"); } if (cont_ch0){ /*Ho letto un carattere*/ /*Incremento contatore*/ cont_ch++; } /*oppure molto piu' semplicemente si poteva usare la funzione lseek*/ /* cont_ch=lseed(fd, 0L, 2) */ /*Comunico al padre la lunghezza in caratteri del file*/ write(pfd_f[indice][1],&cont_ch,sizeof(long int)); /*Attendo la stringa che mi scrive il padre*/ if (read(pfd_p[indice][0],Media,12)!=12) { fprintf(stderr,"Lettura invalida da pdf_d[%d][0]\n",indice); exit(-1); } /*Scrivo sul file Fout stringa concatenata*/ snprintf(temp,256,"%s %s\n",Fi,Media); write(fdout,&temp,strlen(temp)); /*Controllo valore scritto dal padre su pipe pfd_p*/ if(strcmp(Media,"Sopra Media")==0){ retval=2; } if(strcmp(Media,"Sotto Media")==0){ retval=1; } if(strcmp(Media,"Equal Media")==0){ retval=0; } /*Ritorno retval al padre*/ return(retval); }