0Pricing
C Academy · Lección

Señales

Notificaciones asíncronas

Señales es una lección gratuita de C Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.

Qué es una señal

Una señal es una notificación asíncrona que se envía a un proceso para indicarle que ha ocurrido un evento, como que un usuario pulse Ctrl-C o que termine un proceso hijo. Las señales son una forma ligera de IPC.

Señales habituales

Algunas que encontrará con frecuencia:

  • SIGINT interrupción (Ctrl-C)
  • SIGTERM solicitud de terminación ordenada
  • SIGKILL terminación forzada (no se puede capturar)
  • SIGCHLD un hijo ha cambiado de estado
  • SIGSEGV acceso no válido a memoria

Disposiciones predeterminadas

Cada señal tiene una acción predeterminada: terminar, terminar con volcado de memoria, ignorar, detener o continuar. Puede sustituir la mayoría de estas acciones mediante un controlador.

Instalar un controlador

La forma moderna y portable de establecer un controlador es sigaction. El controlador es una función que recibe el número de la señal.

#include <signal.h>
#include <stdio.h>

void on_signal(int sig) {
    /* note: printf is not async-signal-safe; for demo only */
    write(1, "caught\n", 7);
}

int install(void) {
    struct sigaction sa = {0};
    sa.sa_handler = on_signal;
    return sigaction(SIGINT, &sa, NULL);
}

Por qué no usar signal()

La antigua función signal() tiene un comportamiento incoherente entre sistemas (restablecimiento del controlador y falta de control sobre SA_RESTART). Prefiera sigaction, cuyo comportamiento está bien definido y es portable.

Funciones seguras para señales asíncronas

Un controlador puede interrumpir su código en cualquier momento, por lo que solo puede llamar a funciones seguras para señales asíncronas, como write. Llamar a printf o malloc desde un controlador puede provocar un interbloqueo o corrupción.

Usar una bandera volatile

Un patrón seguro: el controlador establece una bandera volatile sig_atomic_t y el bucle principal la comprueba. Así, el controlador se mantiene pequeño y seguro.

#include <signal.h>

volatile sig_atomic_t stop = 0;

void handler(int sig) {
    stop = 1; /* only set a flag */
}
/* main loop: while (!stop) { do_work(); } */

Enviar señales

Use kill(pid, sig) para enviar una señal a otro proceso, o raise(sig) para enviársela a usted mismo. A pesar de su nombre, kill envía cualquier señal, no solo las letales.

#include <signal.h>

int notify(int pid) {
    return kill(pid, SIGTERM); /* ask process to terminate */
}

Bloquear señales

Para proteger una sección crítica, bloquee temporalmente las señales con sigprocmask y un conjunto de señales. Las señales bloqueadas permanecen pendientes y se entregan cuando se desbloquean.

#include <signal.h>

void block_int(void) {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, NULL);
}

Recolectar procesos hijos con SIGCHLD

Cuando un proceso hijo termina, el kernel envía SIGCHLD. Un controlador que llame a waitpid recolecta el proceso hijo y evita los procesos zombi que permanecen en la tabla de procesos.

#include <signal.h>
#include <sys/wait.h>

void reap(int sig) {
    while (waitpid(-1, NULL, WNOHANG) > 0)
        ; /* reap all finished children */
}

Señales que no se pueden capturar

Hay dos señales absolutas: SIGKILL siempre termina el proceso y SIGSTOP siempre lo detiene. No se pueden capturar, bloquear ni ignorar, lo que proporciona al sistema una forma garantizada de controlar los procesos.

Comprobación rápida

Compruebe cuánto entiende sobre las señales.

Repaso

Ha aprendido a usar señales para la notificación asíncrona.

  • Instale controladores con sigaction, no con el antiguo signal
  • Los controladores deben ser seguros para señales asíncronas; es preferible establecer una bandera
  • Envíe señales con kill/raise y bloquéelas con sigprocmask
  • Recolecte los procesos hijos mediante SIGCHLD; SIGKILL y SIGSTOP no se pueden capturar

Preguntas frecuentes

¿La lección «Señales» es gratis?

Sí — el texto completo de «Señales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Señales»?

Notificaciones asíncronas Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Señales»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Tuberías
  2. Memoria compartida
  3. Colas de mensajes
  4. Señales
← Volver a C Academy