trap
trap(...)
public
Specifies the handling of signals. The first parameter is a signal name (a string such as ``SIGALRM’’, ``SIGUSR1’’, and so on) or a signal number. The characters ``SIG’‘ may be omitted from the signal name. The command or block specifies code to be run when the signal is raised. If the command is the string ``IGNORE’‘ or ``SIG_IGN’’, the signal will be ignored. If the command is ``DEFAULT’‘ or ``SIG_DFL’’, the operating system’s default handler will be invoked. If the command is ``EXIT’’, the script will be terminated by the signal. Otherwise, the given command or block will be run. The special signal name ``EXIT’‘ or signal number zero will be invoked just prior to program termination. trap returns the previous handler for the given signal.
Signal.trap(0, proc { puts "Terminating: #{$$}" }) Signal.trap("CLD") { puts "Child died" } fork && Process.wait
produces:
Terminating: 27461 Child died Terminating: 27460
Return value not correct
It seems like trap returns nil if the handler was “DEFAULT”, but calling trap with nil causes a “IGNORE”
2.0.0-p247 :020 > p trap("CHLD", "DEFAULT") nil => nil 2.0.0-p247 :021 > p trap("CHLD", nil) nil => nil
So it seems that once you trap a signal, there isn’t a way to reset them back to what they were originally.