/* FILE: pipe-newSenzalettoreConHandler.c */ #include #include #include #include #include #define MSGSIZE 5 #define TRUE 1 #define FALSE 0 int flag = FALSE; void Azione(int sig) { printf("Arrivato segnale # %d\n", sig); flag = TRUE; } int main (int argc, char **argv) { int pid, j, piped[2]; char mess[MSGSIZE]; /* char inpbuf [MSGSIZE]; */ if (argc != 2) { printf("Numero dei parametri errato\n"); exit(1); } /* si crea una pipe */ if (pipe (piped) < 0 ) { exit (2); } if ((pid = fork()) < 0) { exit (3); } else if (pid == 0) { /* figlio */ int fd; sleep(2); /* andiamo a introdurre un ritardo per essere sicuri che quando comincia a scrivere il processo padre sia terminato */ signal(SIGPIPE, Azione); /* si aggancia Azione per trattare il segnale SIGPIPE */ close (piped [0]); /* il figio CHIUDE il lato di lettura */ if ((fd = open(argv[1], O_RDONLY)) < 0) { printf("Errore in apertura file %s\n", argv[1]); exit(4); } printf("Figlio %d sta per iniziare a scrivere una serie di messaggi, ognuno di lunghezza %d, sulla pipe dopo averli letti dal file passato come parametro\n", getpid(), MSGSIZE); while (read(fd, mess, MSGSIZE)) /* il contenuto del file e' tale che in mess ci saranno 4 caratteri e il terminatore di linea */ { /* il padre ha concordato con il figlio che gli mandera' solo stringhe e quindi dobbiamo sostituire il terminatore di linea con il terminatore di stringa */ mess[MSGSIZE-1]='\0'; if (!flag) write (piped[1], mess, MSGSIZE); else { puts("NON C'E' LETTORE"); exit(4); } j++; } printf("Figlio %d scritto %d messaggi sulla pipe\n", getpid(), j); exit (0); } else { /* padre */ close (piped [1]); /* il padre CHIUDE il lato di scrittura */ printf("Padre %d sta per iniziare a leggere i messaggi dalla pipe\n", getpid()); j =0; /* il padre inizializza la sua variabile j per verificare se il padre gli ha mandato 10 stringhe */ /* termina subito ===> PIPE SENZA PIU'LETTORE */ /* BISOGNA FARE IN MODO CHE IL PADRE TERMINI PRIMA DEL FIGLIO E QUINDI BISOGNA COMMENTARE LA wait ((int *)0); */ /* padre NON aspetta il figlio */ exit (0); } }