/* Soluzione della parte C del compito del 25 Gennaio 2023 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; /* VARIABILI GLOBALI */ int *finito; /* array dinamico per indicare i figli che sono terminati */ /* la semantica di questo array e' che ogni elemento vale 0 se il corrisponde * nte processo NON e' finito, altrimenti vale 1 */ int N; /* numero di processi figli (N.B. nome indicato dal testo) */ int finitof() { /* questa funzione verifica i valori memorizzati nell'array finito: appena trova un elemento uguale a 0 vuole dire che non tutti i processi figli sono finiti e quindi torna 0; tornera' 1 se e solo se tutti gli elementi dell'array sono a 1 e quindi tutti i processi sono finiti */ int i; for (i=0; i < N; i++) if (!finito[i]) /* appena ne trova uno che non ha finito */ return 0; /* ritorna falso */ return 1; } int main (int argc, char **argv) { int pid; /* pid per fork */ pipe_t *piped; /* array di pipe */ int n,j; /* indici(N.B. n nome indicato dal testo) */ int fdr, fdw; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ char chs[2]; /* caratteri letti dai figli dal proprio file (N.B. nome indicato dal testo)*/ /* N.B: dato che il numero di caratteri che devono essere letti ogni volta e' noto STATISTICAMENTE si deve usare un array STATICO */ int nr,nw; /* variabili per salvare valori di ritorno di read/write da/su file e pipe */ /* controllo sul numero di parametri almeno 3 file */ if (argc < 4) { printf("Errore numero di parametri: argc = %d\n", argc); exit(1); } N = argc-2; /* i file passati sono N+1 */ printf("Numero di processi da creare %d\n", N); /* allocazione memoria dinamica per finito */ finito = (int *) malloc(sizeof(int) * N); if(finito == NULL) { printf("Errore nella allocazione della memoria per array finito\n"); exit(2); } /* ... e inizializzazione a 0: all'inizio nessun figlio e' finito */ memset(finito, 0, N*sizeof(int)); /* allocazione pipe */ if ((piped=(pipe_t *)malloc(N*sizeof(pipe_t))) == NULL) { printf("Errore allocazione pipe\n"); exit(3); } /* creazione pipe */ for (n=0;n> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d (se 255 problemi)\n", pidFiglio, ritorno); } } exit(0); }