Fixes issue #14396: Handle the odd rare case of waitpid returning 0 when
not expected in subprocess.Popen.wait().
This commit is contained in:
parent
9463e3ac8b
commit
2ec82331b2
|
@ -1428,7 +1428,7 @@ class Popen(object):
|
|||
def wait(self):
|
||||
"""Wait for child process to terminate. Returns returncode
|
||||
attribute."""
|
||||
if self.returncode is None:
|
||||
while self.returncode is None:
|
||||
try:
|
||||
pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
|
||||
except OSError as e:
|
||||
|
@ -1437,8 +1437,12 @@ class Popen(object):
|
|||
# This happens if SIGCLD is set to be ignored or waiting
|
||||
# for child processes has otherwise been disabled for our
|
||||
# process. This child is dead, we can't get the status.
|
||||
pid = self.pid
|
||||
sts = 0
|
||||
self._handle_exitstatus(sts)
|
||||
# Check the pid and loop as waitpid has been known to return
|
||||
# 0 even without WNOHANG in odd situations. issue14396.
|
||||
if pid == self.pid:
|
||||
self._handle_exitstatus(sts)
|
||||
return self.returncode
|
||||
|
||||
|
||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.2.4
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #14396: Handle the odd rare case of waitpid returning 0 when not
|
||||
expected in subprocess.Popen.wait().
|
||||
|
||||
- Issue #9535: Fix pending signals that have been received but not yet
|
||||
handled by Python to not persist after os.fork() in the child process.
|
||||
|
||||
|
|
Loading…
Reference in New Issue