def _cmd_read_write_fds(notifier):
if sys.modules.get('fcntl'):
class PipeFD(object):
def __init__(self, fileno):
self._fileno = fileno
self._timeout = None
self._timeout_id = None
self._notifier = notifier
flags = fcntl.fcntl(self._fileno, fcntl.F_GETFL)
fcntl.fcntl(self._fileno, fcntl.F_SETFL, flags | os.O_NONBLOCK)
def _read_fn(self):
os.read(self._fileno, 128)
def close(self):
if self._notifier:
self._notifier.unregister(self)
os.close(self._fileno)
self._notifier = None
def _eof(self):
self._read_fn()
pipein, pipeout = os.pipe()
return (PipeFD(pipein), PipeFD(pipeout))
elif hasattr(socket, 'socketpair'):
return socket.socketpair()
else:
srv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv_sock.bind(('127.0.0.1', 0))
srv_sock.listen(1)
write_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
write_sock.setblocking(False)
try:
write_sock.connect(srv_sock.getsockname()[:2])
except socket.error as e:
if e.args[0] in (EINPROGRESS, EWOULDBLOCK):
pass
else:
raise
write_sock.setblocking(True)
read_sock = srv_sock.accept()[0]
except:
write_sock.close()
raise
finally:
srv_sock.close()
return (read_sock, write_sock)
评论列表
文章目录