OILS
/
frontend
/
signal_def.py
1 |
#!/usr/bin/env python2
|
2 |
"""Signal_def.py."""
|
3 |
from __future__ import print_function
|
4 |
|
5 |
import signal
|
6 |
|
7 |
from typing import Dict
|
8 |
|
9 |
|
10 |
def _MakeSignalsOld():
|
11 |
# type: () -> Dict[str, int]
|
12 |
"""Piggy-back on CPython signal module.
|
13 |
|
14 |
This causes portability problems
|
15 |
"""
|
16 |
names = {} # type: Dict[str, int]
|
17 |
for name in dir(signal):
|
18 |
# don't want SIG_DFL or SIG_IGN
|
19 |
if name.startswith('SIG') and not name.startswith('SIG_'):
|
20 |
int_val = getattr(signal, name)
|
21 |
abbrev = name[3:]
|
22 |
names[abbrev] = int_val
|
23 |
return names
|
24 |
|
25 |
|
26 |
# POSIX 2018
|
27 |
# https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
|
28 |
|
29 |
_PORTABLE_SIGNALS = [
|
30 |
'SIGABRT',
|
31 |
'SIGALRM',
|
32 |
'SIGBUS',
|
33 |
'SIGCHLD',
|
34 |
'SIGCONT',
|
35 |
'SIGFPE',
|
36 |
'SIGHUP',
|
37 |
'SIGILL',
|
38 |
'SIGINT',
|
39 |
#SIGKILL
|
40 |
'SIGPIPE',
|
41 |
'SIGQUIT',
|
42 |
'SIGSEGV',
|
43 |
'SIGSTOP',
|
44 |
'SIGTERM',
|
45 |
'SIGTSTP',
|
46 |
'SIGTTIN',
|
47 |
'SIGTTOU',
|
48 |
'SIGUSR1',
|
49 |
'SIGUSR2',
|
50 |
'SIGSYS',
|
51 |
'SIGTRAP',
|
52 |
'SIGURG',
|
53 |
'SIGVTALRM',
|
54 |
'SIGXCPU',
|
55 |
'SIGXFSZ',
|
56 |
|
57 |
# Not part of POSIX, but essential for Oils to work
|
58 |
'SIGWINCH',
|
59 |
]
|
60 |
|
61 |
|
62 |
def _MakeSignals():
|
63 |
# type: () -> Dict[str, int]
|
64 |
"""Piggy-back on CPython signal module.
|
65 |
|
66 |
This causes portability problems
|
67 |
"""
|
68 |
names = {} # type: Dict[str, int]
|
69 |
for name in _PORTABLE_SIGNALS:
|
70 |
int_val = getattr(signal, name)
|
71 |
assert name.startswith('SIG'), name
|
72 |
abbrev = name[3:]
|
73 |
names[abbrev] = int_val
|
74 |
return names
|
75 |
|
76 |
|
77 |
NO_SIGNAL = -1
|
78 |
|
79 |
|
80 |
def GetNumber(sig_spec):
|
81 |
# type: (str) -> int
|
82 |
return _SIGNAL_NAMES.get(sig_spec, NO_SIGNAL)
|
83 |
|
84 |
|
85 |
_SIGNAL_NAMES = _MakeSignals()
|
86 |
|
87 |
_BY_NUMBER = _SIGNAL_NAMES.items()
|
88 |
_BY_NUMBER.sort(key=lambda x: x[1])
|
89 |
|
90 |
|
91 |
def PrintSignals():
|
92 |
# type: () -> None
|
93 |
for name, int_val in _BY_NUMBER:
|
94 |
print('%2d SIG%s' % (int_val, name))
|