summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <pitrou@free.fr>2017-05-04 14:44:53 (GMT)
committerGitHub <noreply@github.com>2017-05-04 14:44:53 (GMT)
commit6dd4d734ed207ba16b017e38f8909de7ef187e29 (patch)
tree2f51ce31377b6d69f1ae65de83c172cbd99ca464
parent3d0056842c5e06b4102f990b59ab3b607f932dd8 (diff)
downloadcpython-6dd4d734ed207ba16b017e38f8909de7ef187e29.zip
cpython-6dd4d734ed207ba16b017e38f8909de7ef187e29.tar.gz
cpython-6dd4d734ed207ba16b017e38f8909de7ef187e29.tar.bz2
bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver (#1319)
* bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver * Tweak comment
-rw-r--r--Lib/multiprocessing/forkserver.py20
-rw-r--r--Misc/NEWS3
2 files changed, 17 insertions, 6 deletions
diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py
index f2c179e..d5ce625 100644
--- a/Lib/multiprocessing/forkserver.py
+++ b/Lib/multiprocessing/forkserver.py
@@ -149,8 +149,15 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
util._close_stdin()
- # ignoring SIGCHLD means no need to reap zombie processes
- handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN)
+ # ignoring SIGCHLD means no need to reap zombie processes;
+ # 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, \
selectors.DefaultSelector() as selector:
_forkserver._forkserver_address = listener.getsockname()
@@ -175,7 +182,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
code = 1
if os.fork() == 0:
try:
- _serve_one(s, listener, alive_r, handler)
+ _serve_one(s, listener, alive_r, old_handlers)
except Exception:
sys.excepthook(*sys.exc_info())
sys.stderr.flush()
@@ -186,11 +193,12 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
if e.errno != errno.ECONNABORTED:
raise
-def _serve_one(s, listener, alive_r, handler):
- # close unnecessary stuff and reset SIGCHLD handler
+def _serve_one(s, listener, alive_r, handlers):
+ # close unnecessary stuff and reset signal handlers
listener.close()
os.close(alive_r)
- signal.signal(signal.SIGCHLD, handler)
+ for sig, val in handlers.items():
+ signal.signal(sig, val)
# receive fds from parent process
fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1)
diff --git a/Misc/NEWS b/Misc/NEWS
index 4e85c0f..d76c76b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -317,6 +317,9 @@ Extension Modules
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 ``'`'``
as zero instead of space.