Skip to content

Commit 6dd4d73

Browse files
authored
bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver (#1319)
* bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver * Tweak comment
1 parent 3d00568 commit 6dd4d73

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
@@ -317,6 +317,9 @@ Extension Modules
317317
Library
318318
-------
319319

320+
- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process
321+
when Ctrl-C is received.
322+
320323
- bpo-30103: binascii.b2a_uu() and uu.encode() now support using ``'`'``
321324
as zero instead of space.
322325

0 commit comments

Comments
 (0)