3 # Copyright 2016 The Go Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style
5 # license that can be found in the LICENSE file.
7 # Create sigtab.go from gen-sysinfo.go.
9 # This shell scripts creates the sigtab.go file, which maps signals to
10 # their dispositions. We generate a file so that we can build a
11 # composite literal that only refers to signals that are defined on
14 # This script simply writes to standard output.
18 echo '// Generated by mksigtab.sh. Do not edit.'
20 echo 'package runtime'
22 echo 'var sigtable = [...]sigTabT{'
26 # Handle signals valid on all Unix systems.
29 # Get the signal number and add it to SIGLIST
30 signum
=`grep "const $1 = " gen-sysinfo.go | sed -e 's/.* = //'`
31 if echo "$signum" |
grep '^_SIG[A-Z0-9_]*$' >/dev
/null
2>&1; then
32 # Recurse once to obtain signal number
33 # This is needed for some MIPS signals defined as aliases of other signals
34 signum
=`grep "const $signum = " gen-sysinfo.go | sed -e 's/.* = //'`
36 # Only add signal if the signal number isn't in the list yet.
37 # For example, musl libc uses signal 29 for both SIGIO and SIGPOLL.
38 if ! echo "$SIGLIST" |
grep "_${signum}_" >/dev
/null
2>&1; then
40 SIGLIST
=$SIGLIST"_${signum}_"
44 echo ' 0: {0, "SIGNONE: no trap"},'
45 addsig _SIGHUP
'{_SigNotify + _SigKill, "SIGHUP: terminal line hangup"}'
46 addsig _SIGINT
'{_SigNotify + _SigKill, "SIGINT: interrupt"}'
47 addsig _SIGQUIT
'{_SigNotify + _SigThrow, "SIGQUIT: quit"}'
48 addsig _SIGILL
'{_SigThrow + _SigUnblock, "SIGILL: illegal instruction"}'
49 addsig _SIGTRAP
'{_SigThrow + _SigUnblock, "SIGTRAP: trace trap"}'
50 addsig _SIGABRT
'{_SigNotify + _SigThrow, "SIGABRT: abort"}'
51 addsig _SIGBUS
'{_SigPanic + _SigUnblock, "SIGBUS: bus error"}'
52 addsig _SIGFPE
'{_SigPanic + _SigUnblock, "SIGFPE: floating-point exception"}'
53 addsig _SIGKILL
'{0, "SIGKILL: kill"}'
54 addsig _SIGUSR1
'{_SigNotify, "SIGUSR1: user-defined signal 1"}'
55 addsig _SIGSEGV
'{_SigPanic + _SigUnblock, "SIGSEGV: segmentation violation"}'
56 addsig _SIGUSR2
'{_SigNotify, "SIGUSR2: user-defined signal 2"}'
57 addsig _SIGPIPE
'{_SigNotify, "SIGPIPE: write to broken pipe"}'
58 addsig _SIGALRM
'{_SigNotify, "SIGALRM: alarm clock"}'
59 addsig _SIGTERM
'{_SigNotify + _SigKill, "SIGTERM: termination"}'
60 addsig _SIGCHLD
'{_SigNotify + _SigUnblock, "SIGCHLD: child status has changed"}'
61 addsig _SIGCONT
'{_SigNotify + _SigDefault, "SIGCONT: continue"}'
62 addsig _SIGSTOP
'{0, "SIGSTOP: stop"}'
63 addsig _SIGTSTP
'{_SigNotify + _SigDefault, "SIGTSTP: keyboard stop"}'
64 addsig _SIGTTIN
'{_SigNotify + _SigDefault, "SIGTTIN: background read from tty"}'
65 addsig _SIGTTOU
'{_SigNotify + _SigDefault, "SIGTTOU: background write to tty"}'
66 addsig _SIGURG
'{_SigNotify, "SIGURG: urgent condition on socket"}'
67 addsig _SIGXCPU
'{_SigNotify, "SIGXCPU: cpu limit exceeded"}'
68 addsig _SIGXFSZ
'{_SigNotify, "SIGXFSZ: file size limit exceeded"}'
69 addsig _SIGVTALRM
'{_SigNotify, "SIGVTALRM: virtual alarm clock"}'
70 addsig _SIGPROF
'{_SigNotify + _SigUnblock, "SIGPROF: profiling alarm clock"}'
71 addsig _SIGWINCH
'{_SigNotify, "SIGWINCH: window size change"}'
72 addsig _SIGSYS
'{_SigThrow, "SIGSYS: bad system call"}'
74 # Handle signals that are not supported on all systems.
77 if grep "const $1 = " gen-sysinfo.go
>/dev
/null
2>&1 \
78 && ! grep "const $1 = _SIG" gen-sysinfo.go
> /dev
/null
2>&1; then
83 checksig _SIGSTKFLT
'{_SigThrow + _SigUnblock, "SIGSTKFLT: stack fault"}'
84 checksig _SIGIO
'{_SigNotify, "SIGIO: i/o now possible"}'
85 checksig _SIGPWR
'{_SigNotify, "SIGPWR: power failure restart"}'
86 checksig _SIGEMT
'{_SigThrow, "SIGEMT: emulate instruction executed"}'
87 checksig _SIGINFO
'{_SigNotify, "SIGINFO: status request from keyboard"}'
88 checksig _SIGTHR
'{_SigNotify, "SIGTHR: reserved"}'
89 checksig _SIGPOLL
'{_SigNotify, "SIGPOLL: pollable event occurred"}'
90 checksig _SIGWAITING
'{_SigNotify, "SIGWAITING: reserved signal no longer used by"}'
91 checksig _SIGLWP
'{_SigNotify, "SIGLWP: reserved signal no longer used by"}'
92 checksig _SIGFREEZE
'{_SigNotify, "SIGFREEZE: special signal used by CPR"}'
93 checksig _SIGTHAW
'{_SigNotify, "SIGTHAW: special signal used by CPR"}'
94 checksig _SIGCANCEL
'{_SigSetStack + _SigUnblock, "SIGCANCEL: reserved signal for thread cancellation"}'
95 checksig _SIGXRES
'{_SigNotify, "SIGXRES: resource control exceeded"}'
96 checksig _SIGJVM1
'{_SigNotify, "SIGJVM1: reserved signal for Java Virtual Machine"}'
97 checksig _SIGJVM2
'{_SigNotify, "SIGJVM2: reserved signal for Java Virtual Machine"}'
98 checksig _SIGLOST
' {_SigNotify, "SIGLOST: resource lost (Sun); server died (GNU)"}'
100 # Special handling of signals 32 and 33 on GNU/Linux systems,
101 # because they are special to glibc.
102 # Signal 34 is additionally special to Linux systems with musl.
103 if test "${GOOS}" = "linux"; then
104 SIGLIST
=$SIGLIST"_32__33__34_"
105 echo ' 32: {_SigSetStack + _SigUnblock, "signal 32"}, /* SIGCANCEL; see issue 6997 */'
106 echo ' 33: {_SigSetStack + _SigUnblock, "signal 33"}, /* SIGSETXID; see issues 3871, 9400, 12498 */'
107 echo ' 34: {_SigSetStack + _SigUnblock, "signal 34"}, /* musl SIGSYNCCALL; see issue 39343 */'
110 if test "${GOOS}" = "aix"; then
111 # _NSIG = _NSIG32/_NSIG64 and _NSIG* = _SIGMAX* + 1
112 bits
=`grep 'const _NSIG = _NSIG[0-9]*$' gen-sysinfo.go | sed -e 's/.* = _NSIG\([0-9]*\)/\1/'`
113 nsig
=`grep "const _SIGMAX$bits = [0-9]*$" gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
114 nsig
=`expr $nsig + 1`
116 nsig
=`grep 'const _*NSIG = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
117 if test -z "$nsig"; then
118 if grep 'const _*NSIG = [ (]*_*SIGRTMAX + 1[ )]*' gen-sysinfo.go
>/dev
/null
2>&1; then
119 rtmax
=`grep 'const _*SIGRTMAX = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
120 if test -n "$rtmax"; then
121 nsig
=`expr $rtmax + 1`
122 elif grep 'const _*SIGRTMAX = [ (]*_*SIGRTMIN[ )]*' gen-sysinfo.go
>/dev
/null
2>&1; then
123 rtmin
=`grep 'const _*SIGRTMIN = [0-9]*$' gen-sysinfo.go | sed -e 's/.* = \([0-9]*\)/\1/'`
124 if test -n "$rtmin"; then
125 nsig
=`expr $rtmin + 1`
132 if test -z "$nsig"; then
133 echo 1>&2 "could not determine number of signals"
138 # Fill in the remaining signal numbers in sigtable
139 while test "$i" -lt "$nsig"; do
140 if ! echo $SIGLIST |
grep "_${i}_" >/dev
/null
2>&1; then
141 echo " $i: {_SigNotify, \"signal $i\"},"