mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
asyncio: be more lenient if we don't understand status returned by waitpid().
This should have no effect, it's a "shouldn't happe" case. Also tidied up some comments.
This commit is contained in:
parent
22c3176426
commit
8da15cc218
2 changed files with 14 additions and 14 deletions
|
@ -3,7 +3,6 @@
|
|||
import collections
|
||||
import errno
|
||||
import fcntl
|
||||
import functools
|
||||
import os
|
||||
import signal
|
||||
import socket
|
||||
|
@ -167,22 +166,26 @@ class SelectorEventLoop(selector_events.BaseSelectorEventLoop):
|
|||
|
||||
def _sig_chld(self):
|
||||
try:
|
||||
# because of signal coalescing, we must keep calling waitpid() as
|
||||
# long as we're able to reap a child
|
||||
# Because of signal coalescing, we must keep calling waitpid() as
|
||||
# long as we're able to reap a child.
|
||||
while True:
|
||||
try:
|
||||
pid, status = os.waitpid(-1, os.WNOHANG)
|
||||
except ChildProcessError:
|
||||
break
|
||||
break # No more child processes exist.
|
||||
if pid == 0:
|
||||
break
|
||||
break # All remaining child processes are still alive.
|
||||
elif os.WIFSIGNALED(status):
|
||||
# A child process died because of a signal.
|
||||
returncode = -os.WTERMSIG(status)
|
||||
elif os.WIFEXITED(status):
|
||||
# A child process exited (e.g. sys.exit()).
|
||||
returncode = os.WEXITSTATUS(status)
|
||||
else:
|
||||
# shouldn't happen
|
||||
continue
|
||||
# A child exited, but we don't understand its status.
|
||||
# This shouldn't happen, but if it does, let's just
|
||||
# return that status; perhaps that helps debug it.
|
||||
returncode = status
|
||||
transp = self._subprocesses.get(pid)
|
||||
if transp is not None:
|
||||
transp._process_exited(returncode)
|
||||
|
@ -480,18 +483,15 @@ class _UnixSubprocessTransport(transports.SubprocessTransport):
|
|||
loop = self._loop
|
||||
if proc.stdin is not None:
|
||||
transp, proto = yield from loop.connect_write_pipe(
|
||||
functools.partial(
|
||||
_UnixWriteSubprocessPipeProto, self, STDIN),
|
||||
lambda: _UnixWriteSubprocessPipeProto(self, STDIN),
|
||||
proc.stdin)
|
||||
if proc.stdout is not None:
|
||||
transp, proto = yield from loop.connect_read_pipe(
|
||||
functools.partial(
|
||||
_UnixReadSubprocessPipeProto, self, STDOUT),
|
||||
lambda: _UnixReadSubprocessPipeProto(self, STDOUT),
|
||||
proc.stdout)
|
||||
if proc.stderr is not None:
|
||||
transp, proto = yield from loop.connect_read_pipe(
|
||||
functools.partial(
|
||||
_UnixReadSubprocessPipeProto, self, STDERR),
|
||||
lambda: _UnixReadSubprocessPipeProto(self, STDERR),
|
||||
proc.stderr)
|
||||
if not self._pipes:
|
||||
self._try_connected()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue