Commit 6dd4d734 authored by Antoine Pitrou's avatar Antoine Pitrou Committed by GitHub

bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver (#1319)

* bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver

* Tweak comment
parent 3d005684
...@@ -149,8 +149,15 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): ...@@ -149,8 +149,15 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
util._close_stdin() util._close_stdin()
# ignoring SIGCHLD means no need to reap zombie processes # ignoring SIGCHLD means no need to reap zombie processes;
handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN) # letting SIGINT through avoids KeyboardInterrupt tracebacks
handlers = {
signal.SIGCHLD: signal.SIG_IGN,
signal.SIGINT: signal.SIG_DFL,
}
old_handlers = {sig: signal.signal(sig, val)
for (sig, val) in handlers.items()}
with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \
selectors.DefaultSelector() as selector: selectors.DefaultSelector() as selector:
_forkserver._forkserver_address = listener.getsockname() _forkserver._forkserver_address = listener.getsockname()
...@@ -175,7 +182,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): ...@@ -175,7 +182,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
code = 1 code = 1
if os.fork() == 0: if os.fork() == 0:
try: try:
_serve_one(s, listener, alive_r, handler) _serve_one(s, listener, alive_r, old_handlers)
except Exception: except Exception:
sys.excepthook(*sys.exc_info()) sys.excepthook(*sys.exc_info())
sys.stderr.flush() sys.stderr.flush()
...@@ -186,11 +193,12 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): ...@@ -186,11 +193,12 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
if e.errno != errno.ECONNABORTED: if e.errno != errno.ECONNABORTED:
raise raise
def _serve_one(s, listener, alive_r, handler): def _serve_one(s, listener, alive_r, handlers):
# close unnecessary stuff and reset SIGCHLD handler # close unnecessary stuff and reset signal handlers
listener.close() listener.close()
os.close(alive_r) os.close(alive_r)
signal.signal(signal.SIGCHLD, handler) for sig, val in handlers.items():
signal.signal(sig, val)
# receive fds from parent process # receive fds from parent process
fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1) fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1)
......
...@@ -317,6 +317,9 @@ Extension Modules ...@@ -317,6 +317,9 @@ Extension Modules
Library Library
------- -------
- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process
when Ctrl-C is received.
- bpo-30103: binascii.b2a_uu() and uu.encode() now support using ``'`'`` - bpo-30103: binascii.b2a_uu() and uu.encode() now support using ``'`'``
as zero instead of space. as zero instead of space.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment