Skip to content

Commit a7e48b5

Browse files
authored
[3.6] bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver (GH-1319) (#1454)
* bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver * Tweak comment. (cherry picked from commit 6dd4d73)
1 parent 31906b4 commit a7e48b5

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

Lib/multiprocessing/forkserver.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,15 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
149149

150150
util._close_stdin()
151151

152-
# ignoring SIGCHLD means no need to reap zombie processes
153-
handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN)
152+
# ignoring SIGCHLD means no need to reap zombie processes;
153+
# letting SIGINT through avoids KeyboardInterrupt tracebacks
154+
handlers = {
155+
signal.SIGCHLD: signal.SIG_IGN,
156+
signal.SIGINT: signal.SIG_DFL,
157+
}
158+
old_handlers = {sig: signal.signal(sig, val)
159+
for (sig, val) in handlers.items()}
160+
154161
with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \
155162
selectors.DefaultSelector() as selector:
156163
_forkserver._forkserver_address = listener.getsockname()
@@ -175,7 +182,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
175182
code = 1
176183
if os.fork() == 0:
177184
try:
178-
_serve_one(s, listener, alive_r, handler)
185+
_serve_one(s, listener, alive_r, old_handlers)
179186
except Exception:
180187
sys.excepthook(*sys.exc_info())
181188
sys.stderr.flush()
@@ -186,11 +193,12 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
186193
if e.errno != errno.ECONNABORTED:
187194
raise
188195

189-
def _serve_one(s, listener, alive_r, handler):
190-
# close unnecessary stuff and reset SIGCHLD handler
196+
def _serve_one(s, listener, alive_r, handlers):
197+
# close unnecessary stuff and reset signal handlers
191198
listener.close()
192199
os.close(alive_r)
193-
signal.signal(signal.SIGCHLD, handler)
200+
for sig, val in handlers.items():
201+
signal.signal(sig, val)
194202

195203
# receive fds from parent process
196204
fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1)

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ Core and Builtins
3636
Library
3737
-------
3838

39+
- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process
40+
when Ctrl-C is received.
41+
3942
- bpo-28556: Various updates to typing module: add typing.NoReturn type, use
4043
WrapperDescriptorType, minor bug-fixes. Original PRs by
4144
Jim Fasarakis-Hilliard and Ivan Levkivskyi.

0 commit comments

Comments
 (0)