next up previous
Next: Exemplo usando sleep(): Up: Emissão de um sinal Previous: Exemplo 1:

Exemplo 2:

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



Celso Alberto Saibel Santos 2000-11-14