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.