/* Soluzione della parte C del compito del 18 gennaio 2017 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; typedef struct{ int id; /* indice figlio (campo c1 del testo) */ int num; /* numero corrispondente al carattere numerico (campo c2 del testo) */ } s; int main (int argc, char **argv) { int N; /* numero di file */ int *pid; /* array di 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 legge dalla pipe i-1 e scrive sulla pipe i */ int i,j; /* contatori */ int fd; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ char Cn, ch; /* carattere trovato e carattere letto */ s *cur; /* array di strutture usate dal figlio corrente */ long int somma=0; /* variabile per salvare la somma dei numeri comunicati dai figli */ int nr; /* variabile per salvare valori di ritorno di read su pipe */ /* controllo sul numero di parametri: almeno 1 file */ if (argc < 2) { printf("Errore numero di parametri\n"); exit(1); } N = argc-1; printf("Numero di processi da creare %d\n", N); /* allocazione pid */ if ((pid=(int *)malloc(N*sizeof(int))) == NULL) { printf("Errore allocazione pid\n"); exit(2); } /* allocazione pipe */ if ((pipes=(pipe_t *)malloc(N*sizeof(pipe_t))) == NULL) { printf("Errore allocazione pipe\n"); exit(3); } /* creazione pipe */ for (i=0;i 0) { /* cerco il primo carattere numerico */ if (isdigit(ch)) { Cn=ch; /* non strettamente necessario, ma fatto per maggior leggibilita' */ cur[i].num=(int)(Cn-'0'); /* printf("Sono il figlio di indice %d e pid %d e ho trovato il carattere %c\n", cur[i].id, getpid(), Cn); */ break; /* al primo carattere numerico trovato smettiamo di leggere dal file */ } } 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)); if (nr != i*sizeof(s)) { printf("Figlio %d ha letto un numero di strutture sbagliate %d\n", i, nr); exit(-1); } /* for(j=0;j> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato il carattere numerico %c\n", pidFiglio, ritorno); } } exit(0); }