/* Soluzione della Prova d'esame del 4 Giugno 2010 - Parte C */ #include #include #include #include #include #include #include #define PERM 0644 typedef int pipe_t[2]; int main(int argc, char **argv) { /* -------- Variabili locali ---------- */ int N; /* numero di file passati sulla riga di comando */ int pid_master; /* variabile per process identifier per il master */ int pid; /* variabile per process identifier per le fork */ int fdr; /* file descriptor per ciascun file */ int fdw; /* file descriptor per file creato dal master */ int nr; /* numero di caratteri letti dalla pipe dal master */ int status; /* variabile di stato per la wait */ pipe_t *piped; /* array dinamico di pipe descriptors */ int i, j, k; /* indici per i cicli */ char buffer[120]; /* buffer per leggere i caratteri */ int cont; /* variabile per conteggio linee */ int finito; /* variabile che serve al master per sapere se non ci sono piu' linee da leggere */ /* ------------------------------------ */ /* Controllo sul numero di parametri */ if (argc < 2) { printf("Errore nel numero dei parametri: almeno 1!\n"); exit(1); } /* Calcolo del numero di file */ N = argc - 1; /* Allocazione dell'array di N pipe */ piped = (pipe_t *) malloc (N*sizeof(pipe_t)); if(piped == NULL) { printf("Errore nella allocazione della memoria per le pipe\n"); exit(2); } /* Creazione delle N pipe slave-master */ for (i=0; i 0) { if (buffer[j] == '\n') /* trovato fine linea */ { if (buffer[0] == buffer[j-1]) { /* se il primo e ultimo carattere (chiaramente escluso il terminatore) sono uguali ... */ /* comunica la linea (con il terminatore) al master: si inviano sempre 120 caratteri! */ write(piped[i-1][1], buffer, sizeof(buffer)); cont++; /* si incrementa il contatore delle linee inviate al master */ } j = 0; /* si deve riazzerare l'indice del buffer di linea */ } else j++; /* si deve incrementare l'indice del buffer di linea */ } /* Il figlio slave ritorna il numero di linee comunicate al master */ exit(cont); } else { /* codice figlio master */ if ((fdw = creat("UGUALE", PERM)) < 0) { printf("Errore nella creazione del file UGUALE\n"); exit(0); /* nessun numero di linee in questo caso */ } /* Chiusura lati pipe */ for(j=0; j> 8) & 0xFF; if (pid == pid_master) printf("Il figlio master con pid %d ha ritornato %d numero di linee\n", pid, cont); else printf("Il figlio slave con pid %d ha ritornato %d numero di linee\n", pid, cont); } } exit(0); }