/* soluzione parte C esame del 10 Luglio 2019 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; /* tipo di dato per contenere i file descriptors di una pipe */ int main(int argc, char **argv) { int N; /* numero di file: i processi figli saranno il doppio! */ int pid; /* variabile per fork */ pipe_t *pipe_f; /* array di pipe per la comunicazione dai primi N figli agli ultimi N figli */ pipe_t *pipe_fbis; /* array di pipe per la comunicazione dagli ultimi N figli ai primi N figli */ /* OSSERVAZIONE: IN ALTERNATIVA POTEVA ESSERE USATO UN SOLO ARRAY DI DIMENSIONE 2 * N: CHIARAMENTE IN QUESTO CASO GLI INDICI DA USARE SAREBBERO DIVERSI RISPETTO A QUESTA SOLUZIONE! */ int fd; /* variabile per open */ char ch; /* variabile per leggere dai figli */ char Cz; /* variabile per tenere traccia del carattere da cercare */ int occ; /* variabile per tenere traccia del numero di occorrenze trovate */ long int pos; /* posizione corrente del carattere trovato: inviamo il valore ricavato dalla lseek decrementato di 1 dato che dopo la lettura l'I/O pointer e' posizionato sul carattere seguente quello letto */ long int posLetta; /* posizione corrente del carattere trovato ricevuta */ int status, pidFiglio, ritorno; /* per wait */ int i, j; /* indici per cicli */ int nr, nw; /* per controlli read e write su/da pipe */ /* Controllo sul numero di parametri */ if (argc < 4) { printf("Errore numero parametri %d\n", argc); exit(1); } /* calcoliamo il numero dei file: ATTENZIONE BISOGNA TOGLIERE 2 PERCHE' C'E' ANCHE IL CARATTERE Cz */ N = argc - 2; /* Controlliamo se l'ultimo parametro e' un singolo carattere */ if (strlen(argv[argc-1]) != 1) { printf("Errore ultimo parametro non singolo carattere %s\n", argv[argc-1]); exit(2); } Cz = argv[argc-1][0]; /* isoliamo il carattere che devono cercare i figli */ printf("Carattere da cercare %c\n", Cz); /* allocazione memoria dinamica per pipe_f e pipe_fbis */ pipe_f=malloc(N*sizeof(pipe_t)); pipe_fbis=malloc(N*sizeof(pipe_t)); if ((pipe_f == NULL) || (pipe_fbis == NULL)) { printf("Errore nelle malloc\n"); exit(3); } /* creazione delle pipe */ for (i=0; i < N; i++) { if (pipe(pipe_f[i])!=0) { printf("Errore creazione delle pipe primi N figli e gli ultimi N\n"); exit(4); } if (pipe(pipe_fbis[i])!=0) { printf("Errore creazione delle pipe ultimi N figli e i primii N\n"); exit(5); } } /* creazione dei processi figli: ne devono essere creati 2 * N */ for (i=0; i < 2*N; i++) { pid=fork(); if (pid < 0) /* errore */ { printf("Errore nella fork con indice %d\n", i); exit(6); } if (pid == 0) { /* codice del figlio */ /* stampa di debugging */ if (i < N) /* siamo nel codice dei primi N figli */ { printf("Figlio di indice %d e pid %d associato al file %s\n",i,getpid(), argv[i+1]); /* chiudiamo le pipe che non servono */ /* ogni figlio scrive solo su pipe_f[i] e legge solo da pipe_fbis[i] */ for (j=0;j> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d\n", pidFiglio, ritorno); } } exit(0); }/* fine del main */