Reap zombies in a signal handler

Avoids relying on jernel behavior, which may not be portable across all
unices
This commit is contained in:
Kovid Goyal 2017-10-22 19:13:13 +05:30
parent d239db8492
commit 6350652009
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 11 additions and 3 deletions

View File

@ -244,6 +244,14 @@ def setup_profiling(args):
print('To view the graphical call data, use: kcachegrind', cg)
def reap_zombies(*a):
while True:
try:
os.waitpid(-1, os.WNOHANG)
except OSError:
break
def main():
try:
sys.setswitchinterval(1000.0) # we have only a single python thread
@ -287,8 +295,8 @@ def main():
raise SystemExit('GLFW initialization failed')
try:
with setup_profiling(args):
# Let the kernel take care of reaping zombie child processes
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
# Avoid needing to launch threads to reap zombies
signal.signal(signal.SIGCHLD, reap_zombies)
run_app(opts, args)
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
finally:

View File

@ -165,7 +165,7 @@ def get_primary_selection():
return '' # There is no primary selection on OS X
g = selection_clipboard_funcs()[0]
if g is None:
# We cannot use check_output as we set SIGCHLD to SIG_IGN
# We cannot use check_output as we set a SIGCHLD handler to reap zombies
ans = subprocess.Popen(['xsel', '-p'], stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE).stdout.read().decode('utf-8')
if ans:
# Without this for some reason repeated pastes dont work