summaryrefslogtreecommitdiff
path: root/Lib/subprocess.py
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2010-12-14 14:38:00 +0000
committerGregory P. Smith <greg@mad-scientist.com>2010-12-14 14:38:00 +0000
commite85db2bbb84ba90c03022860f76ca3cdcdf199c6 (patch)
treedb3bd69dee55a3b2b1db47c54ed8a9d7d0a1ebf7 /Lib/subprocess.py
parent32ef70c827997f869a8d8393e8bde74016b6c8a9 (diff)
downloadcpython-git-e85db2bbb84ba90c03022860f76ca3cdcdf199c6.tar.gz
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 ac46ce85c0..452611c5a9 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1295,7 +1295,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
try:
exception_name, hex_errno, err_msg = data.split(b':', 2)
except ValueError:
@@ -1358,7 +1362,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