/* Soluzione della parte C del compito del 13 Giugno 2018 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; typedef struct{ int pid; /* pid figlio (campo c1 del testo) */ int lunghezza; /* lunghezza linea (campo c2 del testo) */ } s; typedef struct{ int pid; /* pid figlio */ int indice; /* indice del figlio: CAMPO AGGIUNTO DAL PADRE */ int lunghezza; /* lunghezza linea */ } s_padre; void bubbleSort(s_padre v[],int dim) /* il tipo degli elementi NON e' un semplice int come riportato sul testo, ma deve essere il tipo s_padre (appositamente definito) */ { int i; int ordinato=0; s_padre a; /* variabile di appoggio per fare lo scambio */ while (dim>1 && ordinato!=1) { ordinato=1; for (i=0;i v[i+1].lunghezza) /* chiaramente il confronto va fatto sul campo lunghezza della struttura */ { /* viene effettuato in questo caso un ordinamento in senso crescente */ /* scambio gli elementi */ a=v[i]; v[i]=v[i+1]; v[i+1]=a; ordinato=0; } dim--; } }/* fine bubblesort */ int main (int argc, char **argv) { int N; /* numero di file */ int Y; /* numero di linee */ 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 i,j; /* contatori */ int fd; /* file descriptor */ int pidFiglio, status, ritorno; /* per valore di ritorno figli */ char ch; /* carattere letto da linea */ s *cur; /* array di strutture usate dai figli */ s_padre *cur_padre; /* array di strutture usate dal padre */ int nr; /* variabili 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\n"); exit(1); } /* calcoliamo valore di Y e lo controlliamo */ Y=atoi(argv[argc-1]); if (Y < 0) { printf("Errore valore di Y\n"); exit(2); } /* stampa di debugging */ printf("Valore di Y %d\n", Y); N = argc-2; printf("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 (i=0;i0) { /* se leggo un carattere, incremento la lunghezza della linea */ cur[i].lunghezza++; if (ch == '\n') { /* se siamo a fine linea si deve leggere dal figlio precedente l'array (se non siamo il primo figlio) e mandare la struttura al figlio successivo */ 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(N+2); } /* for(j=0;j> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d\n", pidFiglio, ritorno); } } exit(0); }