mirror of https://github.com/python/cpython
Issue #12493: subprocess: communicate() handles EINTR
subprocess.Popen.communicate() now also handles EINTR errors if the process has only one pipe.
This commit is contained in:
parent
4c41f84033
commit
e790131dc6
|
@ -476,7 +476,7 @@ def _eintr_retry_call(func, *args):
|
|||
while True:
|
||||
try:
|
||||
return func(*args)
|
||||
except OSError, e:
|
||||
except (OSError, IOError) as e:
|
||||
if e.errno == errno.EINTR:
|
||||
continue
|
||||
raise
|
||||
|
@ -743,10 +743,10 @@ class Popen(object):
|
|||
raise
|
||||
self.stdin.close()
|
||||
elif self.stdout:
|
||||
stdout = self.stdout.read()
|
||||
stdout = _eintr_retry_call(self.stdout.read)
|
||||
self.stdout.close()
|
||||
elif self.stderr:
|
||||
stderr = self.stderr.read()
|
||||
stderr = _eintr_retry_call(self.stderr.read)
|
||||
self.stderr.close()
|
||||
self.wait()
|
||||
return (stdout, stderr)
|
||||
|
|
|
@ -664,6 +664,22 @@ class _SuppressCoreFiles(object):
|
|||
except (ImportError, ValueError, resource.error):
|
||||
pass
|
||||
|
||||
def test_communicate_eintr(self):
|
||||
# Issue #12493: communicate() should handle EINTR
|
||||
def handler(signum, frame):
|
||||
pass
|
||||
old_handler = signal.signal(signal.SIGALRM, handler)
|
||||
self.addCleanup(signal.signal, signal.SIGALRM, old_handler)
|
||||
|
||||
# the process is running for 2 seconds
|
||||
args = [sys.executable, "-c", 'import time; time.sleep(2)']
|
||||
for stream in ('stdout', 'stderr'):
|
||||
kw = {stream: subprocess.PIPE}
|
||||
with subprocess.Popen(args, **kw) as process:
|
||||
signal.alarm(1)
|
||||
# communicate() will be interrupted by SIGALRM
|
||||
process.communicate()
|
||||
|
||||
|
||||
@unittest.skipIf(mswindows, "POSIX specific tests")
|
||||
class POSIXProcessTestCase(BaseTestCase):
|
||||
|
|
|
@ -21,6 +21,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #12493: subprocess: Popen.communicate() now also handles EINTR errors
|
||||
if the process has only one pipe.
|
||||
|
||||
- Issue #12467: warnings: fix a race condition if a warning is emitted at
|
||||
shutdown, if globals()['__file__'] is None.
|
||||
|
||||
|
|
Loading…
Reference in New Issue