/* soluzione che non ha bisogno di usare array dinamici dato che il numero di processi e' noto staticamente e pari a due */ #include #include #include #include #include #include #define N 2 /* numero di figli da creare: il valore e' COSTANTE! */ typedef int pipe_t[2]; int main(int argc, char **argv) { int pid; /* process identifier dei processi generati tramite fork */ int pidFiglio, status; /* per valore di ritorno figli */ pipe_t pipedFP[N]; /* array STATICO di pipe usate da primo figlio e dal secondo figlio per inviare le informazioni al padre */ pipe_t pipedPF[N]; /* array STATICO di pipe usate dal padre ai figli per richiedere o meno l'invio della linea (si poteva in alternativa usare un segnale) */ int i, j; /* variabili di supporto usate nei cicli for */ int fd; /* file descritor del file aperto dai figli in lettura */ char linea[255]; /* linea letta dai figli (supposta al massimo di 255 compreso il terminatore di linea) */ int L; /* indice per la lettura di un singolo carattere da file che poi rappresentera' la lunghezza della linea corrente (in questo caso compreso il terminatore di linea) da mandare al padre */ char ok; /* variabile per inviare 's' o 'n' ai figli: rispettivamente manda o non mandare la linea corrente */ int L1, L2; /* variabili usate dal padre per leggere le lunghezze della linea corrente inviate da ognuno dei due figli */ int nroLinee=0; /* numero di linee calcolato dal padre */ int ritorno=0; /* variabile per valore di ritorno dei figli: numero di linee inviate al padre, su sua richiesta */ if (argc != 3) { printf("Numero di parametri errati: ci vogliono solo i nomi dei due file\n"); exit(1); } /* creazione delle 2 pipe per la comunicazione figli-padre e delle 2 pipe padre-figli: nota bene non abbiamo bisogno dell'allocazione dinamica perche' abbiamo definito due array statici di pipe! */ for(i = 0; i < N; i++) { if(pipe(pipedFP[i]) < 0) { printf("Errore nella creazione della pipe figlio-padre numero %d\n", i); exit(2); } if(pipe(pipedPF[i]) < 0) { printf("Errore nella creazione della pipe padre-figlio numero %d\n", i); exit(3); } } /* genero i 2 figli */ for(i = 0; i < N; i++) { if((pid = fork()) < 0) { printf("Errore nella creazione di un figlio\n"); exit(4); } if(pid == 0) { /* codice del figlio */ printf("Sono il figlio %d di indice %d\n", getpid(), i); /* chiusura pipes inutilizzate */ for (j=0;j> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato il valore %d (se 255 problemi!)\n", pidFiglio, ritorno); } } exit(0); }