cpython: 484c50bf445c (original) (raw)
Mercurial > cpython
changeset 79266:484c50bf445c 3.2
Fixes issue #15756: subprocess.poll() now properly handles errno.ECHILD to return a returncode of 0 when the child has already exited or cannot be waited on. [#15756]
Gregory P. Smith greg@krypto.org | |
---|---|
date | Sat, 29 Sep 2012 11:40:38 -0700 |
parents | 70af6b53b52a |
children | ba8d85552e34 d3288f1e1025 |
files | Lib/subprocess.py Lib/test/subprocessdata/sigchild_ignore.py Misc/NEWS |
diffstat | 3 files changed, 22 insertions(+), 2 deletions(-)[+] [-] Lib/subprocess.py 9 Lib/test/subprocessdata/sigchild_ignore.py 11 Misc/NEWS 4 |
line wrap: on
line diff
--- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1400,9 +1400,16 @@ class Popen(object): pid, sts = _waitpid(self.pid, _WNOHANG) if pid == self.pid: self._handle_exitstatus(sts)
except _os_error:[](#l1.7)
except _os_error as e:[](#l1.8) if _deadstate is not None:[](#l1.9) self.returncode = _deadstate[](#l1.10)
elif e.errno == errno.ECHILD:[](#l1.11)
# This happens if SIGCLD is set to be ignored or[](#l1.12)
# waiting for child processes has otherwise been[](#l1.13)
# disabled for our process. This child is dead, we[](#l1.14)
# can't get the status.[](#l1.15)
# http://bugs.python.org/issue15756[](#l1.16)
self.returncode = 0[](#l1.17) return self.returncode[](#l1.18)
--- a/Lib/test/subprocessdata/sigchild_ignore.py +++ b/Lib/test/subprocessdata/sigchild_ignore.py @@ -1,6 +1,15 @@ -import signal, subprocess, sys +import signal, subprocess, sys, time
On Linux this causes os.waitpid to fail with OSError as the OS has already
reaped our child process. The wait() passing the OSError on to the caller
and causing us to exit with an error is what we are testing against.
signal.signal(signal.SIGCHLD, signal.SIG_IGN) subprocess.Popen([sys.executable, '-c', 'print("albatross")']).wait() +# Also ensure poll() handles an errno.ECHILD appropriately. +p = subprocess.Popen([sys.executable, '-c', 'print("albatross")']) +num_polls = 0 +while p.poll() is None:
Waiting for the process to finish.
- time.sleep(0.01) # Avoid being a CPU busy loop.
- num_polls += 1
- if num_polls > 3000:
raise RuntimeError('poll should have returned 0 within 30 seconds')[](#l2.19)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -123,6 +123,10 @@ Core and Builtins Library ------- +- Issue #15756: subprocess.poll() now properly handles errno.ECHILD to