/* versione con N pipe di comunicazione/sincronizzaione fra padre e figli e altre N di comunicazione fra figli e padre; inoltre uso del segnale SIGKILL */ #include #include #include #include #include #include #include #include #define PERM 0644 typedef int pipe_t[2]; 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 deve inviare il segnale SIGKILL per terminare forzatamente i figli non ancora terminati */ pipe_t *pipeFiglioPadre; /* array di pipe di comunicazione fra figli e padre */ pipe_t *pipePadreFiglio; /* array di pipe di comunicazione/sincronizzazione fra padre e figlio. NOTA BENE: questa sincronizzazione potrebbe essere fatta tramite l'invio di segnali da parte del padre ai figli */ int i,j; /* contatori */ int fdw,fd; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ char c; /* carattere per leggere dal file da parte dei figli e dalle pipe da parte del padre */ int primoindice; /* serve per salvare l'indice del primo figlio che ha finito di leggere */ char token='x'; /* carattere il cui valore non importa e che serve solo per sincronizzare i figli */ int nr; /* numero di byte letti da file o da pipe */ /* ci vogliono almeno due file */ if (argc < 3) { printf("Errore numero di parametri, dato che argc=%d\n", argc); exit(1); } N = argc-1; /* calcoliamo il numero di file e quindi di processi da creare */ printf("DEBUG-Numero di processi da creare %d\n", N); /* allocazione pid */ if ((pid=(int *)malloc(N*sizeof(int))) == NULL) { printf("Errore allocazione pid\n"); exit(2); } /* allocazione pipe figli-padre */ if ((pipeFiglioPadre=(pipe_t *)malloc(N*sizeof(pipe_t))) == NULL) { printf("Errore allocazione pipe padre\n"); exit(3); } /* allocazione pipe padre-figli */ if ((pipePadreFiglio=(pipe_t *)malloc(N*sizeof(pipe_t))) == NULL) { printf("Errore allocazione pipe padre\n"); exit(4); } /* creazione pipe */ for (i=0;i> 8) & 0xFF); if (ritorno == 255) printf("Il figlio con pid=%d ha avuto un errore\n", pidFiglio); else printf("Il figlio con pid=%d ha ritornato il carattere %c\n", pidFiglio, ritorno); } } exit(0); }