← Arquitectura Cliente-Servidor

Clase 06

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).

Repaso que hizo el profesor de la Clase 05 (la que no asistí)

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.

En corto

🎯 Para el examen

Consulta y estructura del manual de señales (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:

La función signal() y sus 3 escenarios

Prototipo, 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;
}

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.

Procesos en primer plano (foreground) y segundo plano (background)

Secuencia para enviar un proceso a background:

  1. Ejecutar el proceso en primer plano.
  2. Presionar Ctrl+Z para enviar SIGTSTP, dejando el proceso pausado (Stopped).
  3. Escribir 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.

Contexto — no examen
Pendiente / próxima clase