/* Soluzione della parte C del compito del 10 Luglio 2024 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; typedef char tipoL[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: e' stato definito un tipo come suggerito in una nota del testo */ int mia_random(int n) { /* funzione che calcola un numero random compreso fra 1 e n (fornita nel testo) */ int casuale; casuale = rand() % n; casuale++; return casuale; } int main (int argc, char **argv) { /* -------- Variabili locali ---------- */ 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 dalla pipe i-1 e scrive sulla pipe i */ int n,j,k; /* indici */ /* ATTENZIONE NOME n imposto dal testo! */ int fd; /* file descriptor */ /* ATTENZIONE NOME L imposto dal testo! */ tipoL linea; /* linea corrente */ /* ATTENZIONE NOME linea imposto dal testo! */ tipoL *tutteLinee; /* array dinamico di linee */ /* ATTENZIONE NOME tutteLinee imposto dal testo! */ int L; /* variabile per salvare la lunghezza in linee dei file */ int r; /* variabile per i figli per calcolare il valore random */ int nroLinea; /* variabile per contare le linee dei file */ int nr,nw; /* variabili per salvare valori di ritorno di read/write da/su pipe */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ /* ------------------------------------ */ /* controllo sul numero di parametri: almeno 2 file con la loro lunghezza in linee e quindi almeno 4 paramentri (5 con il nome dell'eseguibile) in numero pari */ if ((argc < 5) || (argc-1)%2) { printf("Errore nel numero dei parametri dato che argc=%d (bisogna che il numero dei parametri sia pari e quindi che ci siano almeno due nomi di file insieme con la loro lunghezza in linee!)\n", argc); exit(1); } /* Calcoliamo il numero di file/lunghezze passati */ N = (argc - 1)/2; /* Controlliamo i numeri passati: non usiamo ora la funzione atoi() per trasformare queste stringhe in numeri, dato che i numeri saranno convertiti dai figli. Quindi controlliamo il primo carattere (quello di indice 0) di ogni stringa numerica e se e' il carattere '-' oppure '0' vuol dire che il numero non e' strettamente positivo e diamo errore */ for (n=0; n < N; n++) { /* le stringhe che rappresentano i numeri si trovano con l'indice n moltiplicato per * 2 e sommando 2, cioe' nelle posizioni 2, 4, 6, etc. e quindi saltando le stringhe che rappresentano i nomi dei file */ if (argv[(n*2)+2][0] == '-' || argv[(n*2)+2][0] == '0') { printf("Errore %s non rappresenta un numero strettamente positivo \n", argv[(n*2)+2]); exit(2); } } printf("DEBUG-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); }