OILS / frontend / signal_def.py View on Github | oils.pub

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