Nyx con Ejemplos

Manejo de Señales

signal_handle(signum, fn) registra un callback para una señal del sistema operativo. signal_reset restaura el comportamiento por defecto. Esta receta envía SIGUSR1 a sí mismo y la captura.

Código

// Signal handling — reacting to OS signals
// Manejo de señales — reaccionar a señales del SO

var got_signal: int = 0

fn on_sigusr1() -> int {
    got_signal = 1
    return 0
}

fn main() -> int {
    // Register a handler for SIGUSR1 (signal 10)
    signal_handle(10, on_sigusr1)
    print("handler registered for SIGUSR1")

    // Send SIGUSR1 to ourselves
    let my_pid: int = getpid()
    print("my pid: " + int_to_string(my_pid))
    kill_process(my_pid, 10)

    // Give time for signal delivery
    sleep(10)

    if got_signal == 1 {
        print("signal received!")
    } else {
        print("no signal yet")
    }

    // Reset signal to default behavior
    signal_reset(10)
    print("handler reset to default")

    return 0
}

Salida

handler registered for SIGUSR1
my pid: 12345
signal received!
handler reset to default

Explicación

signal_handle(signum, fn) instala una función callback para el número de señal dado. SIGUSR1 es la señal 10 en Linux. La función manejadora debe tener la firma fn() -> int.

El programa usa kill_process(pid, signal) para enviarse SIGUSR1 a sí mismo. Tras un breve sleep para permitir la entrega, verifica la bandera global que estableció el manejador.

signal_reset(signum) restaura el comportamiento por defecto del sistema operativo para la señal. Para SIGUSR1, la acción por defecto es terminar el proceso, así que no conviene enviarla de nuevo después de restablecerla.

← Anterior Siguiente →

Source: examples/by-example/66-signal-handling.nx