/* Soluzione della parte C del compito del 20 Gennaio 2021 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; int main (int argc, char **argv) { int Q; /* numero di file */ 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 ch; /* carattere letto dai figli dal proprio file */ char ok; /* carattere letto dai figli dalla pipe precedente e scritta su quella successiva */ int k=0; /* fattore moltiplicativo */ long int cur; /* conteggio caratteri letti per capire quando siamo su quello giusto che deve essere stampato: nota bene deve essere un long int! */ /* OSSERVAZIONE: poichè il testo specifica che ogni figlio "legge tutti i caratteri del proprio file associato per operare una selezione" non e' corretto, secondo la specifica, utilizzare solo la lseek per posizionarsi sul carattere giusto e leggere solo quello! */ 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\n"); 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 > di %d problemi)\n", pidFiglio, ritorno, Q-1); } } exit(0); }