From: Victor Stinner Date: Thu, 10 Aug 2017 14:45:38 +0000 (+0200) Subject: [2.7] bpo-31160: Backport reap_children fixes from master to 2.7 (#3063) X-Git-Tag: v2.7.14rc1~18 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1247e2cda514d7a73187e0b53ec8c35d87a34a84;p=python [2.7] bpo-31160: Backport reap_children fixes from master to 2.7 (#3063) * bpo-31160: regrtest now reaps child processes (#3044) Add a post_test_cleanup() function which currently only calls support.reap_children(). (cherry picked from commit e3510d74aacc477c30f42f2b941d69689bbc478e) * bpo-31160: test_tempfile: Fix reap_children() warning (#3056) TestRandomNameSequence.test_process_awareness() now calls os.waitpid() to avoid leaking a zombie process. (cherry picked from commit 6c8c2943d996b59a48d331f61f22cbe72933910e) --- diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 7a48475ee8..7096de8469 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1172,6 +1172,9 @@ class saved_test_environment: return False +def post_test_cleanup(): + test_support.reap_children() + def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None): test_support.unload(test) if verbose: @@ -1205,6 +1208,7 @@ def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=Non refleak = dash_R(the_module, test, indirect_test, huntrleaks) test_time = time.time() - start_time + post_test_cleanup() finally: sys.stdout = save_stdout except test_support.ResourceDenied, msg: diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 5c85cc9bd3..5c111a29ca 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -141,12 +141,15 @@ class test__RandomNameSequence(TC): try: pid = os.fork() if not pid: + # child process os.close(read_fd) os.write(write_fd, next(self.r).encode("ascii")) os.close(write_fd) # bypass the normal exit handlers- leave those to # the parent. os._exit(0) + + # parent process parent_value = next(self.r) child_value = os.read(read_fd, len(parent_value)).decode("ascii") finally: @@ -157,6 +160,10 @@ class test__RandomNameSequence(TC): os.kill(pid, signal.SIGKILL) except EnvironmentError: pass + + # Read the process exit status to avoid zombie process + os.waitpid(pid, 0) + os.close(read_fd) os.close(write_fd) self.assertNotEqual(child_value, parent_value)