/* Soluzione della parte C del compito della II prova in itinere del 1 Giugno 2018 */ #include #include #include #include #include #include /* definiamo un tipo per un array di due interi */ typedef int pipe_t[2]; int main(int argc,char **argv) { int *pid, pidFiglio; /* array di pid per fork e pid per wait*/ int N; /* numero di file passati come parametri e numero di processi figli da creare */ int K; /* intero che rappresenta l'ultimo parametro passato */ int X; /* variabile che deve essere inserita da tastiera */ int L; /* lunghezza di ogni linea calcolata dai figli */ int status, ritorno; /* variabili di stato per le wait e per il ritorno del figlio */ int trovata=0; /* indica se e' stata trovata la linea indicata */ int i,j; /* indici per cicli */ char linea[255]; /* array che serve per salvare la linea letta da ogni figlio, supposta non piu' lunga di 255 caratteri compreso il terminatore di linea (vedi commento riguardo a L nel testo) */ int fd; /* generico file descriptor */ pipe_t *piped; /* vettore dinamico per pipe figlio -> padre */ int nr; /* per controllare valore di ritorno della read da pipe */ /* controlliamo numero di parametri */ /* devono esserci almeno tre parametri piĆ¹ argv[0] */ if (argc < 4) { printf("Errore nel numero di parametri: %d. Ci vuole almeno due nomi di file e un numero che rappresenta il numero medio di linee dei file!\n", argc); exit(1); } /* calcoliamo il numero di files passati */ N=argc-2; /* calcoliamo valore di K e lo controlliamo */ K=atoi(argv[argc-1]); if (K < 0) { printf("Errore valore di K\n"); exit(2); } /* allocazione pid */ if ((pid=(int *)malloc(N*sizeof(int))) == NULL) { printf("Errore allocazione pid\n"); exit(3); } /* allocazione dinamica pipe figli-padre */ piped=(pipe_t *)malloc(sizeof(pipe_t)*N); if (piped == NULL) { printf("Allocazione fallita pipe figli-padre\n"); exit(4); } /* creazione delle N pipe */ for (i=0;i K) { printf("Il valore X inserito non e' valido\n"); exit(6); } /* ciclo per la generazione degli N figli */ for (i=0;i> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d\n", pidFiglio, ritorno); } } exit(0); }/* fine del main */