Preview Ruby 4.1 is a preview. It can change before the final release. Switch to Ruby 4.0 →
Kernel#trap
static VALUE
sig_trap(int argc, VALUE *argv, VALUE _)
{
int sig;
sighandler_t func;
VALUE cmd;
rb_check_arity(argc, 1, 2);
sig = trap_signm(argv[0]);
if (reserved_signal_p(sig)) {
const char *name = signo2signm(sig);
if (name)
rb_raise(rb_eArgError, "can't trap reserved signal: SIG%s", name);
else
rb_raise(rb_eArgError, "can't trap reserved signal: %d", sig);
}
if (argc == 1) {
cmd = rb_block_proc();
func = sighandler;
}
else {
cmd = argv[1];
func = trap_handler(&cmd, sig);
}
if (rb_obj_is_proc(cmd) &&
!rb_ractor_main_p() && !rb_ractor_shareable_p(cmd)) {
cmd = rb_proc_isolate(cmd);
}
return trap(sig, func, cmd);
}
Specifies the handling of signals. Returns the previous handler for the given signal.
Argument signal is a signal name (a string or symbol such as SIGALRM or SIGUSR1) or an integer signal number. When signal is a string or symbol, the leading characters SIG may be omitted.
Argument command or block provided specifies code to be run when the signal is raised.
Argument command may also be a string or symbol with the following special values:
-
IGNORE,SIG_IGN: the signal will be ignored. -
DEFAULT,SIG_DFL: Ruby’s default handler will be invoked. -
EXIT: the process will be terminated by the signal. -
SYSTEM_DEFAULT: the operating system’s default handler will be invoked.
The special signal name EXIT or signal number zero will be invoked just prior to program termination:
Signal.trap(0, proc { puts "Terminating: #{$$}" }) Signal.trap("CLD") { puts "Child died" } fork && Process.wait
Outputs:
Terminating: 27461 Child died Terminating: 27460