Mtro. Carlos Alberto Román Zamitiz · 10 sep 2026 · Manejo de señales con signal(), escenarios de tratamiento de interrupciones y control de procesos en primer/segundo plano (fg/bg).
man 7 signal en la terminal para familiarizarse con la arquitectura y numeración de señales — la columna que aplica para la materia es X86 ARM.1, mostrando que el sistema (init/systemd) lo adopta casi al instante.Esto confirma y precisa lo reconstruido en la Clase 05 — en particular, el número real de SIGCHLD en la arquitectura de la materia es 17, no 18 como aparece en la tabla genérica de UNIX System V.
man 7 signal: documentación oficial y numeración estándar de señales en Linux; columna a consultar: X86 ARM.SIG_IGN), 2) tratarla con una función programada, o 3) el proceso es terminado de inmediato si la señal no puede ignorarse ni tratarse.SIGINT (2): interrupción por teclado (Ctrl+C); por defecto (SIG_DFL) mata el proceso, pero puede ignorarse o capturarse.SIGKILL (9): la más fulminante (kill -9); no puede ignorarse, bloquearse ni tratarse bajo ninguna circunstancia.SIGCHLD (17): el hijo se la manda al padre al morir (sinónimo SIGCLD), para que limpie la tabla de procesos.void y recibir un único parámetro int.bg): Ctrl+Z detiene el proceso en primer plano; bg lo reanuda en segundo plano, liberando el prompt.jobs lista los procesos en background; fg %N regresa el trabajo N a primer plano.signal(signum, handler) — handler puede ser SIG_IGN, SIG_DFL, o la dirección de una función definida por el usuario que debe retornar void y aceptar un int (ej. void manejador_senales(int sig)).SIG_IGN genera error en tiempo de ejecución.static en handlers: para contar cuántas veces se recibió una señal (ej. Ctrl+C) a lo largo de la vida del programa, el contador debe declararse static para preservar su valor entre invocaciones.SIGCHLD ni limpia su entrada en la tabla de procesos.Ctrl+Z detiene sin destruir · bg reanuda en segundo plano · jobs lista trabajos con su [N] · fg %N trae el trabajo N a primer plano · kill -9 PID fuerza terminación inmediata.man 7 signal)Para inspeccionar las señales disponibles en la arquitectura del sistema se ejecuta man 7 signal (capítulo 7 del manual). Dentro de la sección Signal numbering for standard signals, hay que identificar la columna X86 ARM para la correspondencia exacta entre macro en C y número entero:
SIGINT (2): generada por Ctrl+C; interrumpe la ejecución, se puede ignorar o manejar.SIGABRT (6): el proceso se la manda a sí mismo para abortar su ejecución.SIGKILL (9): matanza ineludible e inmediata del proceso.SIGTERM (15): solicitud de terminación enviada por utilidades del sistema (ej. shutdown); puede ignorarse o tratarse.SIGCHLD/SIGCLD (17 en X86/ARM, 18 en otras): enviada por el hijo a su padre al terminar su tarea.signal() y sus 3 escenariosPrototipo, en <signal.h>:
void (*signal(int sig, void (*func)(int)))(int);
Escenario 1 — Ignorar la señal (SIG_IGN):
signal(SIGINT, SIG_IGN);
Con un ciclo while(1), cualquier Ctrl+C es ignorado y el proceso sigue corriendo. Para volver al comportamiento nativo se sustituye por SIG_DFL, que destruye el proceso al presionar Ctrl+C.
Escenario 2 — Manejar/tratar la señal con una función personalizada: debe cumplir estrictamente el prototipo void nombre_funcion(int param).
void manejador_senales(int sig) {
if (sig == SIGINT) {
printf("Señal número %d recibida\n", sig);
}
}
int main() {
signal(SIGINT, manejador_senales);
while(1) {
printf("En espera de Ctrl+C. PID: %d\n", getpid());
sleep(5);
}
return 0;
}
while(1) y el proceso continúa normalmente.exit(0) dentro del manejador (o se condiciona a un número de interrupciones con una variable static int cnt), haciendo que el programa haga su limpieza y termine de forma limpia.Escenario 3 — Señales inalterables / no capturables: el sistema no permite redirigir ni bloquear ciertas señales. Ejemplo principal: SIGKILL (9).
Analogía del profesor: SIGKILL equivale al hechizo Avada Kedavra de Harry Potter: fulminante, ineludible, ningún código puede proteger al proceso de ella. Si se intenta signal(SIGKILL, manejador_senales), la llamada regresa un valor de error indicando que no se puede capturar esa señal.
Secuencia para enviar un proceso a background:
Ctrl+Z para enviar SIGTSTP, dejando el proceso pausado (Stopped).bg en el prompt — el sistema lo reanuda en segundo plano e imprime su identificador de trabajo entre corchetes (ej. [33]).Inconveniente: si el proceso en background tiene printf(), el texto se sigue imprimiendo en la terminal, desplazando el prompt mientras el usuario escribe otros comandos. Para evitarlo, redirigir la salida a un archivo o a /dev/null.
Administración de trabajos: jobs lista los trabajos activos en background ([33], [36], etc.); fg %N trae de vuelta el trabajo N a primer plano — necesario si se le quiere mandar una interrupción Ctrl+C, ya que esa combinación solo afecta al proceso activo en foreground.
SIGCHLD en el proceso padre.