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.