/* Soluzione della parte C del compito del 14 Luglio 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 bastano 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 pipeline da primo figlio, a secondo figlio .... ultimo figlio e poi a padre: ogni processo (a parte il primo) legge dal la pipe i-1 e scrive sulla pipe i */ 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 */ int nroLinee; /* variabile per salvare la lunghezza in linee dei file */ /* ATTENZIONE NOME nroLinee imposto dal testo! */ 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: la specifica diceva minimo un solo file e la lunghezza in linee, ma in realta' era una imprecisione del testo e quindi nella soluzione si e' considerato almeno 2 file e la lunghezza in linee (nella correzione delle consegne si e' considerato quello c'era scritto nei testi)*/ if (argc < 4) { printf("Errore numero di parametri\n"); exit(1); } nroLinee=atoi(argv[argc-1]); if (nroLinee <= 0) { printf("Errore nel numero di linee %d\n", nroLinee); exit(2); } N = argc-2; 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(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); }