Sintaxe
alarme interno sem sinal (segundos int sem sinal)A função é definida em unistd.h arquivo de cabeçalho.
Argumentos
A função leva um argumento, segundos. Após segundos segundos se passaram desde a solicitação do alarme() função, o SIGALRM sinal é gerado. O comportamento padrão no recebimento de SIGALRM é encerrar o processo. Mas podemos captar e controlar o sinal. Veja os detalhes de tratamento de sinal.
O alarme() a função retornará um valor diferente de zero, se outro alarme tiver sido definido anteriormente e o valor for o número de segundos restantes para o alarme agendado anterior devido à entrega. Por outro lado alarme() retornará zero.
Exemplo 1.c:
#incluir#incluir
#incluir
void sig_handler (int signum)
printf ("Função de manipulador interna \ n");
int main ()
sinal (SIGALRM, sig_handler); // Registrar manipulador de sinal
alarme (2); // Alarme programado após 2 segundos
para (int i = 1 ;; i ++)
printf ("% d: função principal interna \ n", i);
dormir (1); // Atrase por 1 segundo
return 0;
Na captura de tela da saída de Exemplo 1.c, o programa é executado usando o comando time, para que possamos ter uma visão geral do tempo de execução do programa. Observamos que na função principal chamamos alarme() função, agendada para 2 segundos. Então, se o loop está em execução, após 2 segundos a função sig_handler é chamada e a execução da função principal é pausada. Após a execução da função sig_handler, na função principal, a execução do loop é retomada. Aqui usamos a função dormir para atrasar, para que possamos entender o fluxo da execução. O loop for é um loop infinito, quando pressionamos uma tecla de interrupção (Ctrl + C), a execução irá parar.
Gerando SIGALRM usando sinal() função não pode ser empilhada. Apenas um SIGALRM geração pode ser agendada. Chamadas sucessivas de sinal() função redefinir o despertador do processo de chamada.
Exemplo 2.c:
#incluir#incluir
#incluir
void sig_handler (int signum)
printf ("Função de manipulador interna \ n");
int main ()
sinal (SIGALRM, sig_handler); // Registrar manipulador de sinal
alarme (4); // Alarme programado após 4 segundos
alarme (1); // Alarme programado após 1 segundo
para (int i = 1 ;; i ++)
printf ("% d: função principal interna \ n", i);
dormir (1); // Atrase por 1 segundo
return 0;
Na captura de tela da saída de Exemplo 2.c, podemos ver que o programa foi executado por mais de 7 segundos, mas o primeiro alarme que foi agendado após 4 segundos não está chamando a função de manipulador. O segundo alarme que foi programado após 1 segundo é redefinido o alarme.
Se o valor do argumento segundos for zero, qualquer solicitação de alarme feita anteriormente é cancelada.
Exemplo 3.c:
#incluir#incluir
#incluir
void sig_handler (int signum)
printf ("Função de manipulador interna \ n");
int main ()
sinal (SIGALRM, sig_handler); // Registrar manipulador de sinal
alarme (2); // Alarme programado após 2 segundos
alarme (0); // Cancelou o alarme anterior
para (int i = 1 ;; i ++)
printf ("% d: função principal interna \ n", i);
dormir (1); // Atrase por 1 segundo
return 0;
Na captura de tela da saída de Exemplo 3.c, podemos ver que o primeiro alarme que foi programado após 2 segundos foi cancelado por causa do segundo alarme por 0 segundo.
Dentro Exemplo 4.c veremos o quão continuamente podemos definir um alarme a cada 2 segundos.
Exemplo 4.c:
#incluir#incluir
#incluir
void sig_handler (int signum)
printf ("Função de manipulador interna \ n");
alarme (2); // Programe um novo alarme após 2 segundos
int main ()
sinal (SIGALRM, sig_handler); // Registrar manipulador de sinal
alarme (2); // Programe o primeiro alarme após 2 segundos
para (int i = 1 ;; i ++)
printf ("% d: função principal interna \ n", i);
pausa(); // esperando até que o sinal seja tratado
return 0;
Na captura de tela da saída de Exemplo 4.c, podemos ver que o alarme é contínuo a cada 2 segundos. Reinicializamos o alarme na função sig_handler.
Dentro Exemplo 5.c vamos ver como podemos atrasar o alarme já agendado. Usaremos o sinal SIGINT para interrupção. Quando o usuário digita Ctrl + C no teclado, SIGINT o sinal irá gerar.
Exemplo 5.c:
#incluir#incluir
#incluir
void sig_handler (int signum)
if (signum == SIGALRM) // manipulador de sinal para SIGALRM
printf ("Função de manipulador interna para SIGALRM \ n");
alarme (2);
if (signum == SIGINT) // manipulador de sinal para SIGINT
printf ("\ nSonoozing por 5 segundos ... \ n");
alarme (5);
int main ()
sinal (SIGALRM, sig_handler); // Registra manipulador de sinal para SIGALRM
sinal (SIGINT, sig_handler); // Registra o manipulador de sinal para SIGINT
alarme (2); // Programe o primeiro alarme após 2 segundos
para (int i = 1 ;; i ++)
printf ("% d: função principal interna \ n", i);
pausa(); // esperando até que o sinal seja tratado
return 0;
Na captura de tela da saída de Exemplo 5.c, podemos ver que quando o usuário digita Ctrl + C o alarme é reiniciado 5 segundos. Neste programa usamos apenas uma função de tratamento para dois sinais diferentes, mas na função de tratamento foi verificado para qual sinal a função de tratamento está sendo chamada.
Conclusão:
Então, vimos como a função de alarme pode ser configurada para disparar o sinal, como reiniciar o alarme, como cancelar o alarme já programado.