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.