/* Soluzione della parte C del compito del 16 Giugno 2021 */ #include #include #include #include #include #include #include #include #define PERM 0644 typedef int pipe_t[2]; typedef char L[250]; /* tipo array statico: per ogni linea letta dai figli dal proprio file come indicato dal testo basta 250 caratteri per linea e terminatore di linea */ int main (int argc, char **argv) { int N; /* numero di file/processi */ /* ATTENZIONE NOME N imposto dal testo! */ int pid; /* pid per fork */ pipe_t *pipes; /* array di pipe usate a ring da primo figlio, a secondo figlio .... ultimo figlio, padre e poi a primo figlio: ogni processo legge dalla pipe n e scrive sulla pipe (n+1) */ int n,j,i,k; /* indici */ /* ATTENZIONE NOME n imposto dal testo! */ int fd, fdw; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ L linea; /* linea corrente */ /* ATTENZIONE NOME linea imposto dal testo! */ L *tutteLinee; /* array dinamico di linee */ /* ATTENZIONE NOME tutteLinee imposto dal testo! */ 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); } N = argc-1; printf("Numero di processi da creare %d\n", N); /* allocazione pipe */ if ((pipes=(pipe_t *)malloc(N*sizeof(pipe_t))) == NULL) { printf("Errore allocazione pipe\n"); exit(2); } /* 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); }