Home | History | Annotate | Download | only in signal
      1 // Copyright 2015 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 /*
      6 Package signal implements access to incoming signals.
      7 
      8 Signals are primarily used on Unix-like systems. For the use of this
      9 package on Windows and Plan 9, see below.
     10 
     11 Types of signals
     12 
     13 The signals SIGKILL and SIGSTOP may not be caught by a program, and
     14 therefore cannot be affected by this package.
     15 
     16 Synchronous signals are signals triggered by errors in program
     17 execution: SIGBUS, SIGFPE, and SIGSEGV. These are only considered
     18 synchronous when caused by program execution, not when sent using
     19 os.Process.Kill or the kill program or some similar mechanism. In
     20 general, except as discussed below, Go programs will convert a
     21 synchronous signal into a run-time panic.
     22 
     23 The remaining signals are asynchronous signals. They are not
     24 triggered by program errors, but are instead sent from the kernel or
     25 from some other program.
     26 
     27 Of the asynchronous signals, the SIGHUP signal is sent when a program
     28 loses its controlling terminal. The SIGINT signal is sent when the
     29 user at the controlling terminal presses the interrupt character,
     30 which by default is ^C (Control-C). The SIGQUIT signal is sent when
     31 the user at the controlling terminal presses the quit character, which
     32 by default is ^\ (Control-Backslash). In general you can cause a
     33 program to simply exit by pressing ^C, and you can cause it to exit
     34 with a stack dump by pressing ^\.
     35 
     36 Default behavior of signals in Go programs
     37 
     38 By default, a synchronous signal is converted into a run-time panic. A
     39 SIGHUP, SIGINT, or SIGTERM signal causes the program to exit. A
     40 SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGSTKFLT, SIGEMT, or SIGSYS signal
     41 causes the program to exit with a stack dump. A SIGTSTP, SIGTTIN, or
     42 SIGTTOU signal gets the system default behavior (these signals are
     43 used by the shell for job control). The SIGPROF signal is handled
     44 directly by the Go runtime to implement runtime.CPUProfile. Other
     45 signals will be caught but no action will be taken.
     46 
     47 If the Go program is started with either SIGHUP or SIGINT ignored
     48 (signal handler set to SIG_IGN), they will remain ignored.
     49 
     50 If the Go program is started with a non-empty signal mask, that will
     51 generally be honored. However, some signals are explicitly unblocked:
     52 the synchronous signals, SIGILL, SIGTRAP, SIGSTKFLT, SIGCHLD, SIGPROF,
     53 and, on GNU/Linux, signals 32 (SIGCANCEL) and 33 (SIGSETXID)
     54 (SIGCANCEL and SIGSETXID are used internally by glibc). Subprocesses
     55 started by os.Exec, or by the os/exec package, will inherit the
     56 modified signal mask.
     57 
     58 Changing the behavior of signals in Go programs
     59 
     60 The functions in this package allow a program to change the way Go
     61 programs handle signals.
     62 
     63 Notify disables the default behavior for a given set of asynchronous
     64 signals and instead delivers them over one or more registered
     65 channels. Specifically, it applies to the signals SIGHUP, SIGINT,
     66 SIGQUIT, SIGABRT, and SIGTERM. It also applies to the job control
     67 signals SIGTSTP, SIGTTIN, and SIGTTOU, in which case the system
     68 default behavior does not occur. It also applies to some signals that
     69 otherwise cause no action: SIGUSR1, SIGUSR2, SIGPIPE, SIGALRM,
     70 SIGCHLD, SIGCONT, SIGURG, SIGXCPU, SIGXFSZ, SIGVTALRM, SIGWINCH,
     71 SIGIO, SIGPWR, SIGSYS, SIGINFO, SIGTHR, SIGWAITING, SIGLWP, SIGFREEZE,
     72 SIGTHAW, SIGLOST, SIGXRES, SIGJVM1, SIGJVM2, and any real time signals
     73 used on the system. Note that not all of these signals are available
     74 on all systems.
     75 
     76 If the program was started with SIGHUP or SIGINT ignored, and Notify
     77 is called for either signal, a signal handler will be installed for
     78 that signal and it will no longer be ignored. If, later, Reset or
     79 Ignore is called for that signal, or Stop is called on all channels
     80 passed to Notify for that signal, the signal will once again be
     81 ignored. Reset will restore the system default behavior for the
     82 signal, while Ignore will cause the system to ignore the signal
     83 entirely.
     84 
     85 If the program is started with a non-empty signal mask, some signals
     86 will be explicitly unblocked as described above. If Notify is called
     87 for a blocked signal, it will be unblocked. If, later, Reset is
     88 called for that signal, or Stop is called on all channels passed to
     89 Notify for that signal, the signal will once again be blocked.
     90 
     91 SIGPIPE
     92 
     93 When a Go program writes to a broken pipe, the kernel will raise a
     94 SIGPIPE signal.
     95 
     96 If the program has not called Notify to receive SIGPIPE signals, then
     97 the behavior depends on the file descriptor number. A write to a
     98 broken pipe on file descriptors 1 or 2 (standard output or standard
     99 error) will cause the program to exit with a SIGPIPE signal. A write
    100 to a broken pipe on some other file descriptor will take no action on
    101 the SIGPIPE signal, and the write will fail with an EPIPE error.
    102 
    103 If the program has called Notify to receive SIGPIPE signals, the file
    104 descriptor number does not matter. The SIGPIPE signal will be
    105 delivered to the Notify channel, and the write will fail with an EPIPE
    106 error.
    107 
    108 This means that, by default, command line programs will behave like
    109 typical Unix command line programs, while other programs will not
    110 crash with SIGPIPE when writing to a closed network connection.
    111 
    112 Go programs that use cgo or SWIG
    113 
    114 In a Go program that includes non-Go code, typically C/C++ code
    115 accessed using cgo or SWIG, Go's startup code normally runs first. It
    116 configures the signal handlers as expected by the Go runtime, before
    117 the non-Go startup code runs. If the non-Go startup code wishes to
    118 install its own signal handlers, it must take certain steps to keep Go
    119 working well. This section documents those steps and the overall
    120 effect changes to signal handler settings by the non-Go code can have
    121 on Go programs. In rare cases, the non-Go code may run before the Go
    122 code, in which case the next section also applies.
    123 
    124 If the non-Go code called by the Go program does not change any signal
    125 handlers or masks, then the behavior is the same as for a pure Go
    126 program.
    127 
    128 If the non-Go code installs any signal handlers, it must use the
    129 SA_ONSTACK flag with sigaction. Failing to do so is likely to cause
    130 the program to crash if the signal is received. Go programs routinely
    131 run with a limited stack, and therefore set up an alternate signal
    132 stack. Also, the Go standard library expects that any signal handlers
    133 will use the SA_RESTART flag. Failing to do so may cause some library
    134 calls to return "interrupted system call" errors.
    135 
    136 If the non-Go code installs a signal handler for any of the
    137 synchronous signals (SIGBUS, SIGFPE, SIGSEGV), then it should record
    138 the existing Go signal handler. If those signals occur while
    139 executing Go code, it should invoke the Go signal handler (whether the
    140 signal occurs while executing Go code can be determined by looking at
    141 the PC passed to the signal handler). Otherwise some Go run-time
    142 panics will not occur as expected.
    143 
    144 If the non-Go code installs a signal handler for any of the
    145 asynchronous signals, it may invoke the Go signal handler or not as it
    146 chooses. Naturally, if it does not invoke the Go signal handler, the
    147 Go behavior described above will not occur. This can be an issue with
    148 the SIGPROF signal in particular.
    149 
    150 The non-Go code should not change the signal mask on any threads
    151 created by the Go runtime. If the non-Go code starts new threads of
    152 its own, it may set the signal mask as it pleases.
    153 
    154 If the non-Go code starts a new thread, changes the signal mask, and
    155 then invokes a Go function in that thread, the Go runtime will
    156 automatically unblock certain signals: the synchronous signals,
    157 SIGILL, SIGTRAP, SIGSTKFLT, SIGCHLD, SIGPROF, SIGCANCEL, and
    158 SIGSETXID. When the Go function returns, the non-Go signal mask will
    159 be restored.
    160 
    161 If the Go signal handler is invoked on a non-Go thread not running Go
    162 code, the handler generally forwards the signal to the non-Go code, as
    163 follows. If the signal is SIGPROF, the Go handler does
    164 nothing. Otherwise, the Go handler removes itself, unblocks the
    165 signal, and raises it again, to invoke any non-Go handler or default
    166 system handler. If the program does not exit, the Go handler then
    167 reinstalls itself and continues execution of the program.
    168 
    169 Non-Go programs that call Go code
    170 
    171 When Go code is built with options like -buildmode=c-shared, it will
    172 be run as part of an existing non-Go program. The non-Go code may
    173 have already installed signal handlers when the Go code starts (that
    174 may also happen in unusual cases when using cgo or SWIG; in that case,
    175 the discussion here applies).  For -buildmode=c-archive the Go runtime
    176 will initialize signals at global constructor time.  For
    177 -buildmode=c-shared the Go runtime will initialize signals when the
    178 shared library is loaded.
    179 
    180 If the Go runtime sees an existing signal handler for the SIGCANCEL or
    181 SIGSETXID signals (which are used only on GNU/Linux), it will turn on
    182 the SA_ONSTACK flag and otherwise keep the signal handler.
    183 
    184 For the synchronous signals and SIGPIPE, the Go runtime will install a
    185 signal handler. It will save any existing signal handler. If a
    186 synchronous signal arrives while executing non-Go code, the Go runtime
    187 will invoke the existing signal handler instead of the Go signal
    188 handler.
    189 
    190 Go code built with -buildmode=c-archive or -buildmode=c-shared will
    191 not install any other signal handlers by default. If there is an
    192 existing signal handler, the Go runtime will turn on the SA_ONSTACK
    193 flag and otherwise keep the signal handler. If Notify is called for an
    194 asynchronous signal, a Go signal handler will be installed for that
    195 signal. If, later, Reset is called for that signal, the original
    196 handling for that signal will be reinstalled, restoring the non-Go
    197 signal handler if any.
    198 
    199 Go code built without -buildmode=c-archive or -buildmode=c-shared will
    200 install a signal handler for the asynchronous signals listed above,
    201 and save any existing signal handler. If a signal is delivered to a
    202 non-Go thread, it will act as described above, except that if there is
    203 an existing non-Go signal handler, that handler will be installed
    204 before raising the signal.
    205 
    206 Windows
    207 
    208 On Windows a ^C (Control-C) or ^BREAK (Control-Break) normally cause
    209 the program to exit. If Notify is called for os.Interrupt, ^C or ^BREAK
    210 will cause os.Interrupt to be sent on the channel, and the program will
    211 not exit. If Reset is called, or Stop is called on all channels passed
    212 to Notify, then the default behavior will be restored.
    213 
    214 Plan 9
    215 
    216 On Plan 9, signals have type syscall.Note, which is a string. Calling
    217 Notify with a syscall.Note will cause that value to be sent on the
    218 channel when that string is posted as a note.
    219 
    220 */
    221 package signal
    222