/* Soluzione della parte C del compito del 17 Febbraio 2021: TUTTI CASI */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; int main (int argc, char **argv) { int Q; /* numero di file/processi */ int pid; /* pid per fork */ pipe_t *pipes; /* array di pipe usate a ring da primo figlio, a secondo figlio .... ultimo figlio e poi a primo figlio: ogni processo legge dalla pipe q e scrive sulla pipe (q+1)%Q */ int q,j; /* indici */ int fd; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ char linea[250]; /* linea letta dai figli dal proprio file (supponiamo bastino 250 caratteri per linea e terminatore di linea, poi tramutato in terminatore di stringa) */ int nrnum, nralfa, nrnoalfanum, nrnonum, nrnoalfa; /* contatori caratteri numerici, alfanumerici, non alfanumerici, non numerici, non alfabetici per ogni linea */ char ok; /* carattere letto dai figli dalla pipe precedente e scritta su quella successiva */ int nr,nw; /* variabili per salvare valori di ritorno di read/write da/su pipe */ /* controllo sul numero di parametri almeno 2 file */ if (argc < 3) { printf("Errore numero di parametri dato che argc=%d\n", argc); exit(1); } Q = argc-1; printf("Numero di processi da creare %d\n", Q); /* allocazione pipe */ if ((pipes=(pipe_t *)malloc(Q*sizeof(pipe_t))) == NULL) { printf("Errore allocazione pipe\n"); exit(2); } /* creazione pipe */ for (q=0;q> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d (se 255 problemi)\n", pidFiglio, ritorno); } } exit(0); }