/* Soluzione della parte C del compito del 16 Febbraio 2022 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; typedef struct { int Fpid; /* pid figlio (campo c1 del testo) */ long int occ; /* numero occorrenze (campo c2 del testo) */ } s_occ; int main (int argc, char **argv) { int N; /* numero di file (NOME STABILITO 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. N.B. Nel caso di schema a pipeline e' molto importante che read e write abbiano SUCCESSO! */ int i,j; /* contatori (i NOME STABILITO DAL TESTO!) */ int fd; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ char Cx, ch; /* carattere da cercare e carattere letto da linea (ch NOME STABILITO DAL TESTO!) */ s_occ *cur; /* array di strutture usate dal figlio corrente (NOME STABILITO DAL TESTO!) */ int nr; /* variabile per salvare valori di ritorno di read su pipe */ /* controllo sul numero di parametri almeno 2 file e un carattere */ if (argc < 4) { printf("Errore numero di parametri: infatti argc e' %d\n", argc); exit(1); } /* controlliamo che l'ultimo parametro sia un singolo carattere */ if (strlen(argv[argc-1]) != 1) { printf("Errore ultimo parametro non singolo carattere\n"); exit(2); } /* individuiamo il carattere da cercare */ Cx = argv[argc-1][0]; /* controlliamo che sia un carattere alfabetico minuscolo */ if (! islower(Cx)) /* N.B. per usare questa funzione bisogna includere string.h */ { printf("Errore ultimo parametro non alfabetico minuscolo\n"); exit(3); } /* stampa di debugging */ printf("DEBUG-Carattere da cercare %c\n", Cx); N = argc-2; /* stampa di debugging */ 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(4); } /* creazione pipe */ for (i=0;i0) { /* cerco il carattere */ if (ch == Cx) { (cur[i].occ)++; /* printf("Sono il figlio di indice %d e pid %d e ho trovato %ld occorrenze del carattere %c\n", cur[i].id, getpid(), cur[i].occ, Cx); */ } } if (i!=0) /* lettura da pipe dell'array di strutture per tutti i figli a parte il primo */ { nr=read(pipes[i-1][0],cur,i*sizeof(s_occ)); if (nr != i*sizeof(s_occ)) { printf("Figlio %d ha letto un numero di strutture sbagliate %d\n", i, nr); exit(N+2); } /* for(j=0;j> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d (se > di %d problemi)\n", pidFiglio, ritorno, N-1); } } exit(0); }