/* Soluzione della parte C del compito della II prova in itinere del 26 Maggio 2017 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; typedef struct{ long int occ; /* numero massimo di occorrenze (campo c1 del testo) */ int id; /* indice figlio (campo c2 del testo) */ long int somma; /* somma del numero di occorrenze (campo c3 del testo) */ } s_occ; int main (int argc, char **argv) { int N; /* numero di file */ int *pid; /* array di pid per fork: N.B. in questo caso serve un array di pid perche' il padre ricevuta la struttura dalla pipe deve riportare il PID del processo che ha calcolato il massimo! */ pipe_t *pipes; /* array di pipe usate a pipeline da primo figlio, a secondo figlio .... ultimo figlio e poi a padre: ogni processo (a parte il primo) legge dalla pipe i-1 e scrive sulla pipe i */ int i,j; /* indici */ int fd; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ char Cx, ch; /* carattere da cercare e carattere letto da file */ long int cur_occ; /* conteggio delle occorrenze calcolate da ogni figlio */ s_occ letta; /* struttura usata dai figli e dal padre */ int nr,nw; /* variabili per salvare valori di ritorno di read/write da/su pipe */ /* controllo sul numero di parametri almeno 2 file e un carattere */ if (argc < 4) { printf("Errore numero di parametri, dato che argc=%d\n", argc); exit(1); } /* controlliamo che l'ultimo paramentro sia un singolo carattere */ if (strlen(argv[argc-1]) != 1) { printf("Errore ultimo parametro non singolo carattere\n"); exit(2); } /* individuiamo il carattere da cercare */ Cx = argv[argc-1][0]; printf("DEBUG-Carattere da cercare %c\n", Cx); N = argc-2; /* calcoliamo il numero di file e quindi il numero di processi figli da creare */ printf("DEBUG-Numero di processi da creare %d\n", N); /* allocazione pid: il padre deve salvare i pid dei figli perche' deve risalire al pid del figlio dal suo indice */ if ((pid=(int *)malloc(N*sizeof(int))) == NULL) { printf("Errore allocazione pid\n"); exit(3); } /* allocazione pipe */ if ((pipes=(pipe_t *)malloc(N*sizeof(pipe_t))) == NULL) { printf("Errore allocazione pipe\n"); exit(4); } /* creazione pipe */ for (i=0;i> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d (se > di %d problemi)\n", pidFiglio, ritorno, N-1); } } exit(0); }