Programación en C

Cómo utilizar SIGALRM y la función de alarma en lenguaje C?

Cómo utilizar SIGALRM y la función de alarma en lenguaje C?
La alarma() La función se utiliza para generar una SIGALRM señal después de un período de tiempo especificado. En este artículo, le mostraremos cómo usar alarma() función y SIGALRM señal en Linux. Entonces empecemos.

Sintaxis

alarma int sin firmar (segundos int sin firmar)

La función se define en unistd.h archivo de cabecera.

Argumentos

La función toma un argumento, segundos. Después segundos Han pasado segundos desde que solicitó el alarma() función, la SIGALRM se genera la señal. El comportamiento predeterminado al recibir SIGALRM es terminar el proceso. Pero podemos captar y manejar la señal. Ver detalles de manejo de señales.

La alarma() La función devolverá un valor distinto de cero, si se ha configurado previamente otra alarma y el valor es el número de segundos que quedan para la alarma programada anterior debido a la entrega. De lo contrario alarma() devolverá cero.

Ejemplo 1.C:

#incluir
#incluir
#incluir
 
void sig_handler (int signum)
 
printf ("Función de controlador interno \ n");

 
int main ()
 
señal (SIGALRM, sig_handler); // Registrar manejador de señales
 
alarma (2); // Alarma programada después de 2 segundos
 
para (int i = 1 ;; i ++)
 
printf ("% d: Dentro de la función principal \ n", i);
dormir (1); // Retraso de 1 segundo

return 0;

En la captura de pantalla de la salida de Ejemplo 1.C, el programa se ejecuta usando el comando time, de modo que podamos obtener una descripción general del tiempo de ejecución del programa. Observamos que en la función principal llamamos alarma() función, programada para 2 segundos. Entonces, el bucle for se está ejecutando, después de 2 segundos se llama a la función sig_handler y se detiene la ejecución de la función principal. Después de la ejecución de la función sig_handler, en la función principal para la ejecución del bucle se reanuda. Aquí usamos la función de dormir para retrasar, de modo que podamos comprender el flujo de la ejecución. El bucle for es un bucle infinito, cuando presionamos una tecla de interrupción (Ctrl + C), la ejecución se detendrá.

Generando SIGALRM utilizando señal() la función no se puede apilar. Sólo uno SIGALRM la generación se puede programar. Llamadas sucesivas de señal() función restablecer el reloj de alarma del proceso de llamada.

Ejemplo 2.C :

#incluir
#incluir
#incluir
 
void sig_handler (int signum)
 
printf ("Función de controlador interno \ n");

 
int main ()
 
señal (SIGALRM, sig_handler); // Registrar manejador de señales
 
alarma (4); // Alarma programada después de 4 segundos
alarma (1); // Alarma programada después de 1 segundo
 
para (int i = 1 ;; i ++)
 
printf ("% d: Dentro de la función principal \ n", i);
dormir (1); // Retraso de 1 segundo

 
return 0;

En la captura de pantalla de la salida de Ejemplo 2.C, podemos ver que el programa se ejecutó más de 7 segundos pero la primera alarma que se programó después de 4 segundos no llama a la función del controlador. La segunda alarma que se programó después de 1 segundo se reinicia la alarma.

Si el valor del argumento segundos es cero, se cancela cualquier solicitud de alarma realizada anteriormente.

Ejemplo 3.C:

#incluir
#incluir
#incluir
 
void sig_handler (int signum)
 
printf ("Función de controlador interno \ n");

 
int main ()
 
señal (SIGALRM, sig_handler); // Registrar manejador de señales
 
alarma (2); // Alarma programada después de 2 segundos
alarma (0); // Cancelada la alarma anterior
 
para (int i = 1 ;; i ++)
 
printf ("% d: Dentro de la función principal \ n", i);
dormir (1); // Retraso de 1 segundo

 
return 0;

En la captura de pantalla de la salida de Ejemplo 3.C, podemos ver que la primera alarma que se programó después de 2 segundos se cancela debido a la segunda alarma durante 0 segundos.

En Ejemplo 4.C veremos cómo continuamente podemos configurar una alarma por cada 2 segundos.

Ejemplo 4.C:

#incluir
#incluir
#incluir
 
void sig_handler (int signum)
 
printf ("Función de controlador interno \ n");
 
alarma (2); // Programe una nueva alarma después de 2 segundos

 
int main ()
 
señal (SIGALRM, sig_handler); // Registrar manejador de señales
 
alarma (2); // Programe la primera alarma después de 2 segundos
 
para (int i = 1 ;; i ++)
 
printf ("% d: Dentro de la función principal \ n", i);
pausa(); // esperando hasta que se maneje la señal

 
return 0;

En la captura de pantalla de la salida de Ejemplo 4.C, podemos ver que la alarma es continua en cada 2 segundos. Reseteamos la alarma en la función sig_handler.

En Ejemplo 5.C veremos como podemos retrasar la alarma ya programada. Usaremos la señal SIGINT para interrumpir. Cuando el usuario escribe Ctrl + C en el teclado, SIGINT la señal generará.

Ejemplo 5.C:

#incluir
#incluir
#incluir
 
void sig_handler (int signum)
 
if (signum == SIGALRM) // manejador de señales para SIGALRM
 
printf ("Función de controlador interno para SIGALRM \ n");
alarma (2);

if (signum == SIGINT) // manejador de señales para SIGINT
printf ("\ nDormir durante 5 segundos ... \ n");
alarma (5);

 

 
int main ()
 
señal (SIGALRM, sig_handler); // Registrar manejador de señales para SIGALRM
señal (SIGINT, sig_handler); // Registrar manejador de señales para SIGINT
 
alarma (2); // Programe la primera alarma después de 2 segundos
 
para (int i = 1 ;; i ++)
 
printf ("% d: Dentro de la función principal \ n", i);
pausa(); // esperando hasta que se maneje la señal

 
return 0;

En la captura de pantalla de la salida de Ejemplo 5.C, Podemos ver que cuando el usuario escribe Ctrl + C, la alarma se reinicia 5 segundos. En este programa hemos usado solo una función de manejador para dos señales diferentes, pero en la función de manejador se ha verificado para qué señal se llama a la función de manejador.

Conclusión:

Entonces, hemos visto cómo se puede configurar la función de alarma para activar la señal, cómo restablecer la alarma, cómo cancelar una alarma ya programada.

Controle y administre el movimiento del mouse entre múltiples monitores en Windows 10
Administrador de mouse de doble pantalla le permite controlar y configurar el movimiento del mouse entre varios monitores, al ralentizar sus movimient...
WinMouse le permite personalizar y mejorar el movimiento del puntero del mouse en una PC con Windows
Si desea mejorar las funciones predeterminadas del puntero del mouse, use el software gratuito WinMouse. Agrega más funciones para ayudarlo a aprovech...
El botón de clic izquierdo del mouse no funciona en Windows 10
Si está utilizando un mouse dedicado con su computadora portátil o computadora de escritorio, pero el el botón izquierdo del mouse no funciona en Wind...