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.