summaryrefslogtreecommitdiffstats
path: root/Lib/subprocess.py
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2010-12-14 15:16:24 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2010-12-14 15:16:24 (GMT)
commitb740e76af01bdd34e53d3c03b812e452f5d9a4e8 (patch)
tree287ba43d8dff4a92295b657cc04b3b5e25661a1a /Lib/subprocess.py
parent6b2af997d433a134d792d4b9b8f696da3cc9bb52 (diff)
downloadcpython-b740e76af01bdd34e53d3c03b812e452f5d9a4e8.zip
cpython-b740e76af01bdd34e53d3c03b812e452f5d9a4e8.tar.gz
cpython-b740e76af01bdd34e53d3c03b812e452f5d9a4e8.tar.bz2
Merged revisions 87233 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r87233 | gregory.p.smith | 2010-12-14 06:38:00 -0800 (Tue, 14 Dec 2010) | 4 lines Issue #1731717: Fixed the problem where subprocess.wait() could cause an OSError exception when The OS had been told to ignore SIGCLD in our process or otherwise not wait for exiting child processes. ........
Diffstat (limited to 'Lib/subprocess.py')
-rw-r--r--Lib/subprocess.py16
1 files changed, 14 insertions, 2 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 0dd55e0..5684d52 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1149,7 +1149,11 @@ class Popen(object):
os.close(errpipe_read)
if data:
- _eintr_retry_call(os.waitpid, self.pid, 0)
+ try:
+ _eintr_retry_call(os.waitpid, self.pid, 0)
+ except OSError as e:
+ if e.errno != errno.ECHILD:
+ raise
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None:
@@ -1195,7 +1199,15 @@ class Popen(object):
"""Wait for child process to terminate. Returns returncode
attribute."""
if self.returncode is None:
- pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
+ try:
+ pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
+ except OSError as e:
+ if e.errno != errno.ECHILD:
+ raise
+ # 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.
+ sts = 0
self._handle_exitstatus(sts)
return self.returncode