/* soluzione parte C esame del 28 Marzo 2008 */ #include #include #include #include #include #include #include #include typedef int pipe_t[2]; /* tipo di dato per contenere i file descriptors di una pipe */ /* VARIABILI GLOBALI */ int N; /* Numero di processi figli */ pipe_t *pipe_fp; /* array di pipe per la comunicazione figli-padre */ pipe_t *pipe_pf; /* array di pipe per la comunicazione padre-figli */ char CZ; /* Dato di progetto */ int Y; /* Dato di progetto */ long int posizione; /* QUESTA VARIABILE TIENE TRACCIA DELLA POSIZIONE NEL FILE, SENZA USARE LSEEK (vedi soluzione con segnali e pipe). Anche in questo caso la posizione iniziale si riferisce allo 0 */ /* funzione processo figlio, prototipo */ int figlio(int arg, const char *filename); int main(int argc, char **argv) { int pid_f; /* per fork */ int status; /* per wait */ int i, j; /* indici per cicli */ int finito; /* per sapere se il padre ha finito di leggere */ char chControllo; /* variabile per inviare indicazione ai figli */ if (argc < 4) { /* il testo non specifica quanti devono essere i parametri, ma e' sensato assumere che ci debbano essere almeno 3 parametri (almeno un nome di file, CZ e Y) e quindi argc >= 4 */ printf("Errore numero argomenti\n"); exit(1); } /* Anche se non richiesti, facciamo il controllo sugli altri due parametri */ /* Controlliamo se il pienultimo parametro e' un singolo carattere */ if (strlen(argv[argc-2]) != 1) { printf("Errore primo parametro non singolo carattere %s\n", argv[1]); exit(2); } /* ricaviamo il carattere CZ */ CZ = argv[argc-2][0]; /* ricaviamo il numero Y */ Y = atoi(argv[argc-1]); /* Controlliamo il numero (deve essere strettamente positivo) */ if (Y <= 0) { printf("Y non valido\n"); exit(3); } N = argc - 3; /* ogni figlio associato a argv[1]..argv[argc-3] */ /* allocazione memoria dinamica per pipe_fp e per pipe_pf */ pipe_fp=malloc(N*sizeof(pipe_t)); if (pipe_fp == NULL) { printf("Errore nella malloc pipe figli-padre\n"); exit(4); } pipe_pf=malloc(N*sizeof(pipe_t)); if (pipe_pf == NULL) { printf("Errore nella malloc pipe padre-figli\n"); exit(5); } /* creazione delle pipe */ for (i=0; i < N; i++) { if (pipe(pipe_fp[i])!=0) { printf("Errore creazione delle pipe figli-padre\n"); exit(6); } if (pipe(pipe_pf[i])!=0) { printf("Errore creazione delle pipe padrei-figli\n"); exit(7); } } /* creazione dei processi figli */ for (i=0; i < N; i++) { switch (fork()) { case 0: /* chiusura lati pipe non utilizzati */ /* ogni figlio scrive solo su pipe_fp[i] e legge solo da pipe_pf[i] */ for (j=0;j