@@ -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 )
0 commit comments