#include #include #include #include #include #define PERM 0644 /* in UNIX */ typedef int pipe_t[2]; int main(int argc, char **argv) { /* Local variables */ int N; /* numero di argomenti come file */ int i, j; /* variabile ausiliaria per i loop */ int pid; /* process identifier di supporto */ int status; /* variabile per lo stato della wait */ int Fi; /* file descriptor per ognuno dei file passati */ pipe_t *piped; /* descrittori delle N pipe */ int occ; /* contatore delle occorrenze di C*/ int occ_prev; /* occorrenze del figlio precedente */ char C; /* carattere argv[argc-1][0] salvato per comodita'  */ char ch; /* buffer per la lettura da file */ /* ----------------*/ /* Controllo sul numero dei parametri */ N=argc-2; /* Tolgo argv[0] e argv[argc-1]*/ if( (N < 2) || ( N%2 != 0)) { printf("Errore nel numero dei parametri. Uso: %s f1 f2 ... fN C \n",argv[0]); exit(-1); } C=argv[argc-1][0]; /* Creazione delle pipe per la comunicazioni tra i figli e alla fine con il padre */ piped = (pipe_t *) malloc(N*sizeof(pipe_t)); if(piped==0) { printf("Errore nella malloc\n"); exit(-2); } /* creazione delle N pipe */ for(i=0; i1)*/ for (j=0; j fai prima lettura a vuoto */ read(Fi, &ch, 1); occ=0; while(read(Fi, &ch, 1)>0) /* qui i due tipi di figli sono allineati al loro primo carattere utile*/ { if (ch == C) occ++; /* Altra lettura a vuoto per saltare il prossimo carattere */ read(Fi, &ch, 1); } /* occ contiene ora il numero di occorrenze trovate fino all'EOF*/ if(i>1) /* ad esclusione dei primi due figli */ { /* aspetto il conteggio dal mio fratello precedente */ read(piped[i-2][0], &occ_prev, sizeof(int)); } else occ_prev=0; /* ci sommo le mie occorrenze ...*/ occ_prev+=occ; /*... e spedisco al successivo (al padre se sono ultimo o penultimo)*/ write(piped[i][1], &occ_prev, sizeof(int)); /* ritorno le occorrenze mie al padre */ exit(occ); } /* codice del padre */ /* Chiude le pipe che non utilizza */ for(i=0; i=N-2; i--) { read(piped[i][0], &occ, sizeof(int)); printf(" Figlio di indice %d ha tornato conteggio totale %d\n", i, occ); } for (i=0; i>8)&0xFF); } exit(0); }