/* Soluzione della Prova del 9 Settembre 2020: soluzione che usa le pipe (invece che i segnali) */ #include #include #include #include #include #include #include typedef int pipe_t[2]; int main(int argc, char **argv) { /* -------- Variabili locali ---------- */ int pid; /* process identifier per le fork() */ int L; /* numero di linee del file */ int Q; /* numero di caratteri e quindi di processi figli */ int status; /* variabile di stato per la wait */ pipe_t *pipePF; /* array dinamico di pipe descriptors per comunicazioni padre-figli */ pipe_t *pipeFP; /* array dinamico di pipe descriptors per comunicazioni figli-padre */ int q, i, j; /* indici per i cicli */ int cont; /* conteggio occorrenze per ogni linea */ int fd; /* per la open nei figli */ char ch; /* carattere per la lettura da file */ char synch; /* carattere di sincroniccazione (NON importa il valore) */ int ritorno; /* variabile che viene ritornata da ogni figlio al padre */ /* ------------------------------------ */ /* Controllo sul numero di parametri */ if (argc < 5 ) /* Devono essere passati almeno 4 parametri */ { printf("Errore nel numero dei parametri\n"); exit(1); } /* Calcoliamo il numero passato come secondo parametro */ L = atoi(argv[2]); if (L <= 0) { printf("Errore: Il secondo parametro non e' un numero strettamente maggiore di 0\n"); exit(2); } /* controlliamo che dal terzo parametro in poi siano singoli caratteri */ for(i=3; i> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d (se 255 problemi nel figlio)\n", pid, ritorno); } } exit(0); }