SIGNAL(2) UNIX Programmer's Manual SIGNAL(2) NAME signal - catch or ignore signals SYNOPSIS #include (*signal(sig, func))() void (*func)(); DESCRIPTION _N._B.: The system currently supports two signal implementa- tions. The one described here is standard in version 7 UNIX systems, and is retained for backward compatabililty. The one described in _s_i_g_s_y_s(2J) as supplemented by _s_i_g_s_e_t(3J) provides for the needs of the job control mechanisms used by _c_s_h(1), and corrects the bugs in this older implementation of signals, allowing programs which process interrupts to be written reliably. A signal is generated by some abnormal event, initiated either by user at a terminal (quit, interrupt), by a program error (bus error, etc.), or by request of another program (kill). Normally all signals cause termination of the receiving process, but a _s_i_g_n_a_l call allows them either to be ignored or to cause an interrupt to a specified location. Here is the list of signals with names as in the include file. SIGHUP 1 hangup SIGINT 2 interrupt SIGQUIT 3* quit SIGILL 4* illegal instruction (not reset when caught) SIGTRAP 5* trace trap (not reset when caught) SIGIOT 6* IOT instruction SIGEMT 7* EMT instruction SIGFPE 8* floating point exception SIGKILL 9 kill (cannot be caught or ignored) SIGBUS 10* bus error SIGSEGV 11* segmentation violation SIGSYS 12* bad argument to system call SIGPIPE 13 write on a pipe with no one to read it SIGALRM 14 alarm clock SIGTERM 15 software termination signal 16 unassigned _N._B.: There are actually more signals; see _s_i_g_s_y_s(2J); the signals listed here are those of standard version 7. The starred signals in the list above cause a core image if not caught or ignored. If _f_u_n_c is SIG_DFL, the default action for signal _s_i_g is reinstated; this default is termination, sometimes with a Printed 5/27/83 1 SIGNAL(2) UNIX Programmer's Manual SIGNAL(2) core image. If _f_u_n_c is SIG_IGN the signal is ignored. Oth- erwise when the signal occurs _f_u_n_c will be called with the signal number as argument. A return from the function will continue the process at the point it was interrupted. Except as indicated, a signal is reset to SIG_DFL after being caught. Thus if it is desired to catch every such signal, the catching routine must issue another _s_i_g_n_a_l call. If, when using this (older) signal interface, a caught sig- nal occurs during certain system calls, the call terminates prematurely. In particular this can occur during an _i_o_c_t_l, _r_e_a_d, or _w_r_i_t_e(2) on a slow device (like a terminal; but not a file); and during _p_a_u_s_e or _w_a_i_t(2). When such a signal occurs, the saved user status is arranged in such a way that when return from the signal-catching takes place, it will appear that the system call returned an error status. The user's program may then, if it wishes, re-execute the call. The value of _s_i_g_n_a_l is the previous (or initial) value of _f_u_n_c for the particular signal. After a _f_o_r_k(2) the child inherits all signals. _E_x_e_c(2) resets all caught signals to default action. If a process is using the mechanisms of _s_i_g_s_y_s(2J) and _s_i_g_s_e_t(3J) then many of these calls are automatically res- tarted (See _s_i_g_s_y_s(2J) and _i_n_t_r_o(3J) for details). ERRORS _S_i_g_n_a_l will fail if: [EINVAL] _S_i_g is an illegal signal number, includ- ing SIGKILL. SEE ALSO kill(1), kill(2), ptrace(2), sigsys(2J), setjmp(3), sigset(3J) BUGS The traps should be distinguishable by extra arguments to the signal handler, and all hardware supplied parameters should be made available to the signal routine. If a repeated signal arrives before the last one can be reset, there is no chance to catch it (however this is not true if you use _s_i_g_s_y_s(2J) and _s_i_g_s_e_t(3J)). The type specification of the routine and its _f_u_n_c argument are problematical. Printed 5/27/83 2 SIGNAL(2) UNIX Programmer's Manual SIGNAL(2) ASSEMBLER (PDP-11) (signal = 48.) sys signal; sig; label (old label in r0) If _l_a_b_e_l is 0, default action is reinstated. If _l_a_b_e_l is 1, the signal is ignored. Any other even _l_a_b_e_l specifies an address in the process where an interrupt is simulated. An RTI or RTT instruction will return from the interrupt. NOTES (VAX-11) See _s_i_g_s_y_s(2J) for information on how hardware faults are mapped into signals. Printed 5/27/83 3