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