#include #include #include #include #include #include #include /*Esame 17 Luglio 2013*/ /*Tipo di Dato pipe*/ typedef int pipe_t[2]; /*Dichiarazione funzione figlio*/ int figlio(char *Fi,int indice); /*Variabili globali, dato che si usa una funzione per il codice dei figli */ int M; /* Numero di file passati come parametri*/ int retval; /* valore di ritorno dei figli al padre */ pipe_t *pfd_p; pipe_t *pfd_f; /* NOTA:Si utilizzano 2M pipe !!*/ /* M pipe pfd_p per la comunicazione figli-padre*/ /* M pipe pfd_f per la comunicazione padre-figli*/ char str[256]; /* Stringa di appoggio per scrittura su stderror e stdout*/ long int cont_ch; /* Variabile long int per conteggio occorrenze */ char ch; /* variabile per contenere i caratteri forniti dall'utente */ int main(int argc,char **argv ) { /* Variabili Locali */ int i; /* variabile per i cicli */ int pid; /* PID per creazione figli*/ int status; /* variabile per wait */ /*Controllo numero parametri: almeno un file */ if (argc < 2) { snprintf(str,256,"USO F1 F2 FM \n"); write(2,str,strlen(str)); exit(1); } /* Ricaviamo numero di figli*/ M=argc-1; /* Allocazione dinamica pipe pfd_p */ pfd_p=(pipe_t*)malloc(sizeof(pipe_t)*M); if (pfd_p==NULL) { snprintf(str,256,"Errore allocazione pipe pfd_p \n "); write(2,str,strlen(str)); exit(2); } /* Creazione Pipe pfd_p */ for (i=0;i0) { /*Ho letto un carattere*/ /* controllo se e' quello cercato */ if (chr == ch) { /*Incremento contatore*/ cont_ch++; /*setto la variabile retval */ retval=1; } } /*Comunico al padre il numero di occorrenze */ write(pfd_p[indice][1],&cont_ch,sizeof(long int)); /* adesso dobbiamo fare un lseek all'inizio per la prossima ricerca */ lseek(fd, 0L, 0); } /*Ritorno retval al padre*/ return(retval); }