The following code is the signal handler used by the Lisp system for the SIGINT signal.
(defun ih-sigint (signal code scp) (declare (ignore signal code scp)) (without-hemlock (with-interrupts (break "Software Interrupt" t))))
without-hemlock form is used to make sure that Hemlock is exited before
a break loop is entered. The
with-interrupts form is used to enable
interrupts because the user may want to generate an interrupt while in the
break loop. Finally, break is called to enter a break loop, so the user
can look at the current state of the computation. If the user proceeds
from the break loop, the computation will be restarted from where it was
The following function is the Lisp signal handler for the SIGTSTP signal which suspends a process and returns to the Unix shell.
(defun ih-sigtstp (signal code scp) (declare (ignore signal code scp)) (without-hemlock (Unix:unix-kill (Unix:unix-getpid) Unix:sigstop)))
Lisp uses this interrupt handler to catch the SIGTSTP signal because it is necessary to get out of Hemlock in a clean way before returning to the shell.
To set up these interrupt handlers, the following is recommended:
(with-enabled-interrupts ((Unix:SIGINT #'ih-sigint) (Unix:SIGTSTP #'ih-sigtstp)) <user code to execute with the above signal handlers enabled.> )