next up previous
Next: Recepção de sinais: Up: Emissão de um sinal Previous: Exemplo 2:

Exemplo usando sleep():

Implementação de uma versão da função sleep() que utiliza as primitivas pause() e alarm(). O princípio de funcionamente é simples: um processo arma um alarme (via alarm()) e se posiciona em pausa (via pause()). Na chegada do sinal SIGALRM, pause() será interrompida e o processo termina sua execução.

                 /* arquivo test_sleep.c */

 /* utilizacao de pause() e de alarm() para
 * implementar uma primitiva sleep2 */

#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void nullfcn()   /* define-se aqui uma funcao executada quando */
{ }              /* o sinal SIGALRM é interceptado por signal() */
                 /* esta funcao nao faz absolutamente nada */

void sleep2(int secs) /* dorme por secs segundos */
{
  if( signal(SIGALRM,nullfcn) )
     {
          perror("error: reception signal") ;
          exit(-1) ;
     }
     alarm(secs) ; /* inicializa o relogio a secs segundos */
     pause() ;     /* processo em espera por um sinal */
}

int main() /* so para testar sleep2() */
{
     if(fork()==0)
     {
          sleep(3) ;
          printf("hello, sleep\n") ;
     }
     else /* pai */
     {
          sleep2(3) ;
          printf("hello, sleep2\n") ;
     }
     exit(0);
}

Resultado da execução:

Após 3 segundos, deve-se obter indiferentemente:

hello, sleep2 
hello, sleep

Ou então:

hello, sleep2 
hello, sleep

Observação: O interesse da função nullfunc() é de se assegurar que o sinal que desperta o processo não provoque o comportamento par défaut e que não seja ignorado, de forma a garantir que a pausa (via pause()) possa ser interrompida.



Celso Alberto Saibel Santos 2000-11-14