/* Soluzione della 2° prova in itinere del 16 marzo 2007 */ /* Soluzione CON UNA SOLA PIPE E SEGNALI */ #include #include #include #include #include #define PERM 0644 /* in UNIX */ /* Variabili globali --> inizializzate a 0 per default */ int contaScritti; /* contatore delle occorrenze scritte da ciascun figlio*/ int fdCreato; /* file descriptor associato ad FCreato */ /* ----------------- */ int scrivi(int sig) { char car[5]="aaaa"; contaScritti+=write(fdCreato, car, 4); signal(SIGUSR1, scrivi); } int esci(int sig) { exit(contaScritti); } main(int argc, char **argv) { /* Variabili locali */ char FCreato[10]; /* spazio per il nome del file da creare*/ int N; /* numero di file passati come parametri della riga di comando*/ int i; /* indice per cicli for */ int *pid; /* pid[] per il ritorno di fork()*/ int Fi; /* file descriptor del file assegnato a ciascun figlio*/ char ch; /* buffer dove mettere ciascun carattere letto da Fi*/ int status; /* variabile di stato della wait */ int pipeFP[2]; /* la pipe dove i figli scrivono i loro pid al padre*/ int occ=0; /* contatore delle 4 occorrenze di 'a' */ /* ----------------*/ /* Controllo sul numero dei parametri */ N=argc-1; if(N == 0) { printf("Errore nel numero dei parametri. Uso: %s file1 file2 ... fileN\n",argv[0]); exit(-1); } strcpy(FCreato, "collect."); strcat(FCreato, "a"); /* Apro il file "collect.a" --> VIENE EREDITATO APERTO DAI FIGLI --> I/O POINTER CONDIVISO!!!! */ if((fdCreato = creat(FCreato, PERM))<0) { printf("Errore di creazione del file %s\n", FCreato); exit(-4); } /* Apro la pipe di collegamento coi figli */ if((pipe(pipeFP)<0)) { printf("Errore di apertura delle pipe\n"); exit(-5); } /* Alloco l'array dei pid */ pid = (int *) malloc(N*sizeof(int)); if(!pid) { printf("Errore di malloc()\n"); exit(-5); } /* ciclo di creazione degli N figli */ for (i=0;i0) { if (ch == 'a') occ++; if(occ==4) { /* comunico al padre il mio pid */ write(pipeFP[1], &i, sizeof(int)); /* mi metto in attesa di un segnale */ pause(); /* ricomincio a contare le occorrenze */ occ=0; } } /* ritorno al padre il conteggio delle occorrenze scritte */ exit(contaScritti); } /* fine figlio */ /* codice del padre */ /* Il padre chiude i lato della pipe che non usa */ close(pipeFP[1]); /* comincio a leggere le occorrenze trovate dai figli */ while(contaScritti < 400) { /* leggo il pid del figlio che ha trovate 4 occorrenze */ read(pipeFP[0], &i, sizeof(int)); contaScritti+=4; if(contaScritti<=400) kill(pid[i], SIGUSR1); } /* invio il segnale di uscita a tutti i figli */ for(i=0; i>8)&0xFF); } }