mirror of
https://github.com/python/cpython.git
synced 2025-08-17 15:21:26 +00:00
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. ........
This commit is contained in:
parent
dacb8043ff
commit
312efbc115
4 changed files with 34 additions and 2 deletions
|
@ -1194,7 +1194,11 @@ class Popen(object):
|
||||||
os.close(errpipe_read)
|
os.close(errpipe_read)
|
||||||
|
|
||||||
if data != "":
|
if data != "":
|
||||||
|
try:
|
||||||
_eintr_retry_call(os.waitpid, self.pid, 0)
|
_eintr_retry_call(os.waitpid, self.pid, 0)
|
||||||
|
except OSError as e:
|
||||||
|
if e.errno != errno.ECHILD:
|
||||||
|
raise
|
||||||
child_exception = pickle.loads(data)
|
child_exception = pickle.loads(data)
|
||||||
for fd in (p2cwrite, c2pread, errread):
|
for fd in (p2cwrite, c2pread, errread):
|
||||||
if fd is not None:
|
if fd is not None:
|
||||||
|
@ -1240,7 +1244,15 @@ class Popen(object):
|
||||||
"""Wait for child process to terminate. Returns returncode
|
"""Wait for child process to terminate. Returns returncode
|
||||||
attribute."""
|
attribute."""
|
||||||
if self.returncode is None:
|
if self.returncode is None:
|
||||||
|
try:
|
||||||
pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
|
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)
|
self._handle_exitstatus(sts)
|
||||||
return self.returncode
|
return self.returncode
|
||||||
|
|
||||||
|
|
6
Lib/test/subprocessdata/sigchild_ignore.py
Normal file
6
Lib/test/subprocessdata/sigchild_ignore.py
Normal file
|
@ -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()
|
|
@ -778,6 +778,16 @@ class POSIXProcessTestCase(BaseTestCase):
|
||||||
self.assertStderrEqual(stderr, '')
|
self.assertStderrEqual(stderr, '')
|
||||||
self.assertEqual(p.wait(), -signal.SIGTERM)
|
self.assertEqual(p.wait(), -signal.SIGTERM)
|
||||||
|
|
||||||
|
def test_wait_when_sigchild_ignored(self):
|
||||||
|
# NOTE: sigchild_ignore.py may not be an effective test on all OSes.
|
||||||
|
sigchild_ignore = test_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")
|
@unittest.skipUnless(mswindows, "Windows specific tests")
|
||||||
class Win32ProcessTestCase(BaseTestCase):
|
class Win32ProcessTestCase(BaseTestCase):
|
||||||
|
|
|
@ -34,6 +34,10 @@ Library
|
||||||
|
|
||||||
- Issue #10464: netrc now correctly handles lines with embedded '#' characters.
|
- Issue #10464: netrc now correctly handles lines with embedded '#' characters.
|
||||||
|
|
||||||
|
- 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.
|
||||||
|
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue