/* Breve esempio di uso della primitiva signal. * Due task che si scambiano alternativamente un segnale a intervalli * "regolari di tempo. * Quesiti: * * 1) Perche' e' stato inseria la linea * if (seconds == 0) * 2) Perche' anche con questa linea c'e' un caso * critico di deadlock e quale e'? */ #include #define __USE_POSIX #include #include #include #include #include "myutil.h" /* Forward declaration */ static void handler (int signo); int seconds; int main(void) { pid_t child, father; struct sigaction nuova, vecchia; seconds = 0; /* Inizializzo i campi della struttura sigaction */ /* indirizzo dell'handler */ nuova.sa_handler = handler; /* Quando l'handler scatta maschera TUTTI i signal */ sigemptyset(&nuova.sa_mask); /* Nessun flag viene settato */ nuova.sa_flags = 0; /* Installo l'handler prima della fork in modo che * sia ereditato dal processo figlio. */ sigaction(SIGUSR1, &nuova, &vecchia); if ((child = fork()) < 0) sys_err("Errore nella fork .... \n"); else if (child == 0) { /* A questo punto sono nel task figlio */ father = getppid(); for(;;) { sleep(1); kill(father, SIGUSR1); pause(); printf("Secondi trascorsi (figlio) %d -- time = %d\n", 2*seconds, (int)time(NULL)); } } else { /* A questo punto sono nel padre */ if (seconds == 0) pause(); for(;;){ printf("Secondi trascorsi (padre) %d -- time = %d \n", 2*seconds-1, (int)time(NULL)); sleep(1); kill(child, SIGUSR1); pause(); } } } /* Handler del signal */ static void handler(int signo) { seconds++; }