/* arquivo test_alarm2.c */ /* * teste dos valores de retorno de alarm() quando 2 * chamadas a alarm() sao feitas sucessivamente */ #include <unistd.h> #include <stdio.h> #include <signal.h> void it_horloge(int sig) /* tratamento do desvio sobre SIGALRM */ { printf("recepcao do sinal %d : SIGALRM\n",sig) ; printf("atencao, o principal reassume o comando\n") ; } void it_quit(int sig) /* tratamento do desvio sobre SIGALRM */ { printf("recepcao do sinal %d : SIGINT\n",sig) ; printf("Por que eu ?\n") ; exit(1) ; } int main() { unsigned sec ; signal(SIGINT,it_quit); /* interceptacao do ctrl-c */ signal(SIGALRM,it_horloge); /* interceptacao do sinal de alarme */ printf("Armando o alarme para 10 segundos\n"); sec=alarm(10); printf("valor retornado por alarm: %d\n",sec) ; printf("Paciencia... Vamos esperar 3 segundos com sleep\n"); sleep(3) ; printf("Rearmando alarm(5) antes de chegar o sinal precedente\n"); sec=alarm(5); printf("novo valor retornado por alarm: %d\n",sec); printf("Principal em loop infinito (ctrl-c para parar)\n"); for(;;); }
Observação: A interceptação do sinal só tem a finalidade de fornecer uma maneira elegante de sair do programa, ou em outras palavras, de permitir um redirecionamento da saída padrão para um arquivo de resultados.
Resultado da execução:
euler:~/> test_alarm2 Armando o alarme para 10 segundos valor retornado por alarm: 0 Paciencia... Vamos esperar 3 segundos com sleep Rearmando alarm(5) antes de chegar o sinal precedente novo valor retornado por alarm: 7 Principal em loop infinito (ctrl-c para parar) recepcao do sinal 14 : SIGALRM atencao, o principal reassume o comando recepcao do sinal 2 : SIGINT Por que eu ? euler:~/>
Pode-se notar que o relógio é reinicializado para o valor de 5 segundos durante a segunda chamada de alarm(), e que mais ainda, o valor retornado é o estado atual do relógio. Finalmente, pode-se observar que o relógio é decrementado ao longo do tempo. As duas últimas linhas da execução são geradas após um sinal CTRL-c do teclado.
Observação: A função sleep() chama a primitiva alarm(). Deve-se então utilizá-la com maior prudência se o programa já manipula o sinal SIGALRM.