/* 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.