Programação C

Como usar o SIGALRM e a função de alarme em linguagem C?

Como usar o SIGALRM e a função de alarme em linguagem C?
O alarme() função é usada para gerar um SIGALRM sinal após um determinado período de tempo decorrido. Neste artigo, mostraremos como usar alarme() função e SIGALRM sinal em Linux. Então vamos começar.

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.

Como aumentar o FPS no Linux?
FPS significa Quadros por segundo. A tarefa do FPS é medir a taxa de quadros em reproduções de vídeo ou desempenho de jogos. Em palavras simples, o nú...
Top jogos do Oculus App Lab
Se você é proprietário de um fone de ouvido Oculus, deve estar informado sobre o carregamento lateral. Sideload é o processo de instalação de conteúdo...
Os 10 melhores jogos para jogar no Ubuntu
A plataforma Windows tem sido uma das plataformas dominantes para jogos devido à grande porcentagem de jogos que estão sendo desenvolvidos hoje para o...