[Python-checkins] r87233 - in python/branches/py3k: Lib/subprocess.py Lib/test/subprocessdata/sigchild_ignore.py Lib/test/test_subprocess.py Misc/NEWS
gregory.p.smith
python-checkins at python.org
Tue Dec 14 15:38:00 CET 2010
Author: gregory.p.smith
Date: Tue Dec 14 15:38:00 2010
New Revision: 87233
Log:
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.
Added:
python/branches/py3k/Lib/test/subprocessdata/sigchild_ignore.py
Modified:
python/branches/py3k/Lib/subprocess.py
python/branches/py3k/Lib/test/test_subprocess.py
python/branches/py3k/Misc/NEWS
Modified: python/branches/py3k/Lib/subprocess.py
==============================================================================
--- python/branches/py3k/Lib/subprocess.py (original)
+++ python/branches/py3k/Lib/subprocess.py Tue Dec 14 15:38:00 2010
@@ -1295,7 +1295,11 @@
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 @@
"""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
Added: python/branches/py3k/Lib/test/subprocessdata/sigchild_ignore.py
==============================================================================
--- (empty file)
+++ python/branches/py3k/Lib/test/subprocessdata/sigchild_ignore.py Tue Dec 14 15:38:00 2010
@@ -0,0 +1,6 @@
+import signal, subprocess, sys
+# 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.SIGCLD, signal.SIG_IGN)
+subprocess.Popen([sys.executable, '-c', 'print("albatross")']).wait()
Modified: python/branches/py3k/Lib/test/test_subprocess.py
==============================================================================
--- python/branches/py3k/Lib/test/test_subprocess.py (original)
+++ python/branches/py3k/Lib/test/test_subprocess.py Tue Dec 14 15:38:00 2010
@@ -1073,6 +1073,16 @@
close_fds=False, pass_fds=(fd, )))
self.assertIn('overriding close_fds', str(context.warning))
+ def test_wait_when_sigchild_ignored(self):
+ # NOTE: sigchild_ignore.py may not be an effective test on all OSes.
+ sigchild_ignore = support.findfile("sigchild_ignore.py",
+ subdir="subprocessdata")
+ p = subprocess.Popen([sys.executable, sigchild_ignore],
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ stdout, stderr = p.communicate()
+ self.assertEqual(0, p.returncode, "sigchild_ignore.py exited"
+ " non-zero with this error:\n%s" % stderr)
+
@unittest.skipUnless(mswindows, "Windows specific tests")
class Win32ProcessTestCase(BaseTestCase):
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Tue Dec 14 15:38:00 2010
@@ -33,6 +33,10 @@
added in 3.2beta1) to allow specifying a specific list of file descriptors
to keep open in the child process.
+- 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.
+
What's New in Python 3.2 Beta 1?
================================
More information about the Python-checkins
mailing list