Cómo usar Sigalrm y la función de alarma en el lenguaje C?

Cómo usar Sigalrm y la función de alarma en el lenguaje C?
El alarma() la función se utiliza para generar un Sigalrm Señal después de que transcurrió una cantidad específica de tiempo. En este artículo, le mostraremos cómo usar alarma() función y Sigalrm señal en Linux. Entonces empecemos.

Sintaxis

unsigned int alarm (sin firmar segundos)

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

Argumentos

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

El alarma() la función devolverá un valor no cero, si se ha establecido previamente otra alarma y el valor es el número de segundos restantes para la alarma programada anterior debido a la entrega de. De lo contrario alarma() devolverá cero.

Ejemplo 1.C:

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

int main ()
señal (Sigalrm, Sig_handler); // Registre el manejador de señal
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 por 1 segundo

regresar 0;

En la captura de pantalla de la salida de Ejemplo 1.C, El programa se ejecuta usando el comando de tiempo, para que podamos obtener una descripción general de la hora de ejecución del programa. Observamos que en la función principal llamamos alarma() función, programada durante 2 segundos. Entonces, para el bucle se está ejecutando, después de 2 segundos se llama a la función Sig_handler y la ejecución de la función principal se detiene. Después de la ejecución de la función SIG_HANDLER, en la función principal para la ejecución de bucle se reanuda. Aquí usamos la función de sueño para retrasarse para que podamos entender 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á.

Generador Sigalrm usando señal() la función no se puede apilar. Sólo uno Sigalrm La generación se puede programar. Sucesivos llamadas de señal() Función Restablecer el despertador del proceso de llamadas.

Ejemplo2.C :

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

int main ()
señal (Sigalrm, Sig_handler); // Registre el manejador de señal
alarma (4); // alarma programada después de 4 segundos
alarma (1); // alarma programada después de 1 segundos
para (int i = 1 ;; i ++)
printf ("%d: dentro de la función principal \ n", i);
dormir (1); // retraso por 1 segundo

regresar 0;

En la captura de pantalla de la salida de Ejemplo2.C, Podemos ver que el programa 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 es restablecer la alarma.

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

Ejemplo3.C:

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

int main ()
señal (Sigalrm, Sig_handler); // Registre el manejador de señal
alarma (2); // alarma programada después de 2 segundos
alarma (0); // canceló la alarma anterior
para (int i = 1 ;; i ++)
printf ("%d: dentro de la función principal \ n", i);
dormir (1); // retraso por 1 segundo

regresar 0;

En la captura de pantalla de la salida de Ejemplo3.C, Podemos ver que la primera alarma que se programó después de 2 segundos se cancela debido a la segunda alarma por 0 segundo.

En Ejemplo4.C Veremos cuán continuamente podemos establecer una alarma por cada 2 segundos.

Ejemplo4.C:

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

int main ()
señal (Sigalrm, Sig_handler); // Registre el manejador de señal
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

regresar 0;

En la captura de pantalla de la salida de Ejemplo4.C, Podemos ver que la alarma es continua en cada 2 segundos. Restablecemos la alarma en la función SIG_HANDLER.

En Ejemplo5.C Veremos cómo podemos retrasar la alarma ya programada. Usaremos Sigint Signal para la interrupción. Cuando el usuario escriba Ctrl+C en el teclado, Firme La señal generará.

Ejemplo5.C:

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

if (Signum == Sigint) // Handler de señal para Sigint
printf ("\ nsnoozing durante 5 segundos ... \ n");
alarma (5);


int main ()
señal (Sigalrm, Sig_handler); // Registre el controlador de señal para Sigalrm
señal (Sigint, Sig_handler); // Registre el controlador de señal 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

regresar 0;

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

Conclusión:

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