From 6350652009bce87e289a867d80009d0fefdc71dd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 22 Oct 2017 19:13:13 +0530 Subject: [PATCH] Reap zombies in a signal handler Avoids relying on jernel behavior, which may not be portable across all unices --- kitty/main.py | 12 ++++++++++-- kitty/utils.py | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/kitty/main.py b/kitty/main.py index 99c4039de..882acb291 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -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: diff --git a/kitty/utils.py b/kitty/utils.py index 2596db2b6..87f385cc6 100644 --- a/kitty/utils.py +++ b/kitty/utils.py @@ -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