Monitor de Señales - Lenguajes de Programación III
Descripción del proyecto
Este programa en C implementa un monitor de señales UNIX, permitiendo capturar y gestionar diferentes señales del sistema mediante el uso de sigaction().
El objetivo es comprender cómo un proceso puede reaccionar ante eventos externos como interrupciones o solicitudes de finalización.
Funcionalidad implementada
Se trabajó con las siguientes señales:
SIGINT (Ctrl + C)
- No finaliza el programa
- Muestra un mensaje en pantalla
SIGTERM
- Finaliza el programa de forma controlada
- Muestra un mensaje de cierre
SIGUSR1
- Incrementa un contador global
- Muestra el valor actualizado
Explicación del código
Librerías utilizadas
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
Variable global segura
volatile sig_atomic_t contador = 0;
Se utiliza sig_atomic_t porque es un tipo de dato seguro para ser modificado dentro de manejadores de señales.
Manejadores de señales
SIGINT
void handler_sigint(int sig) {
printf("SIGINT recibida (Ctrl+C). El programa continúa\n");
}
Captura la señal sin finalizar el programa.
SIGTERM
void handler_sigterm(int sig) {
printf("SIGTERM recibida. Finalizando programa\n");
exit(0);
}
Finaliza el programa de manera controlada.
SIGUSR1
void handler_sigusr1(int sig) {
contador++;
printf("SIGUSR1 recibida. Contador = %d\n", contador);
}
Incrementa un contador global cada vez que se recibe la señal.
Configuración de señales con sigaction()
struct sigaction sa_int, sa_term, sa_usr1;
Configuración de SIGINT:
sa_int.sa_handler = handler_sigint;
sigemptyset(&sa_int.sa_mask);
sa_int.sa_flags = 0;
sigaction(SIGINT, &sa_int, NULL);
Configuración de SIGTERM:
sa_term.sa_handler = handler_sigterm;
sigemptyset(&sa_term.sa_mask);
sa_term.sa_flags = 0;
sigaction(SIGTERM, &sa_term, NULL);
Configuración de SIGUSR1:
sa_usr1.sa_handler = handler_sigusr1;
sigemptyset(&sa_usr1.sa_mask);
sa_usr1.sa_flags = 0;
sigaction(SIGUSR1, &sa_usr1, NULL);
Función principal
int main() {
printf("Monitor de señales en ejecución\n");
printf("Esperando señales\n");
while(1) {
pause();
}
return 0;
}
La función pause() mantiene el programa en ejecución esperando señales.
Compilación
gcc monitor.c -o monitor
Ejecución
./monitor
Pruebas realizadas
SIGINT
Se presionó Ctrl + C durante la ejecución.
Resultado:
SIGINT recibida (Ctrl+C). El programa continúa
SIGTERM
ps aux | grep monitor
kill -15 PID
Resultado:
SIGTERM recibida. Finalizando programa
SIGUSR1
kill -10 PID
Resultado:
SIGUSR1 recibida. Contador = 1
SIGUSR1 recibida. Contador = 2
SIGUSR1 recibida. Contador = 3
Evidencia
Las capturas de ejecución se encuentran en la carpeta img/ y pueden visualizarse en el repositorio.
Conceptos aplicados
- Manejo de señales en sistemas UNIX
- Uso de
sigaction()
- Variables globales seguras (
sig_atomic_t)
- Uso de
kill para pruebas
- Control de ejecución con
pause()
Autor
Eva