示例#1
0
    def Pipe(duplex=True, rnonblock=False, wnonblock=False):  # noqa
        '''
        Returns pair of connection objects at either end of a pipe
        '''
        address = arbitrary_address('AF_PIPE')
        if duplex:
            openmode = _winapi.PIPE_ACCESS_DUPLEX
            access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE
            obsize, ibsize = BUFSIZE, BUFSIZE
        else:
            openmode = _winapi.PIPE_ACCESS_INBOUND
            access = _winapi.GENERIC_WRITE
            obsize, ibsize = 0, BUFSIZE

        h1 = _winapi.CreateNamedPipe(
            address, openmode | _winapi.FILE_FLAG_OVERLAPPED
            | _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE, _winapi.PIPE_TYPE_MESSAGE
            | _winapi.PIPE_READMODE_MESSAGE | _winapi.PIPE_WAIT, 1, obsize,
            ibsize, _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL)
        h2 = _winapi.CreateFile(address, access, 0, _winapi.NULL,
                                _winapi.OPEN_EXISTING,
                                _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL)
        _winapi.SetNamedPipeHandleState(h2, _winapi.PIPE_READMODE_MESSAGE,
                                        None, None)

        overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True)
        _, err = overlapped.GetOverlappedResult(True)
        assert err == 0

        c1 = PipeConnection(duplicate(h1, inheritable=True), writable=duplex)
        c2 = PipeConnection(duplicate(h2, inheritable=True), readable=duplex)
        _winapi.CloseHandle(h1)
        _winapi.CloseHandle(h2)
        return c1, c2
示例#2
0
def PipeServerConnection(address,
                         readable,
                         writable,
                         timeout=nDefaultTimeOut.NMPWAIT_WAIT_FOREVER):
    open_mode = (0x00000000
                 | dwOpenMode.FILE_FLAG_OVERLAPPED
                 | dwOpenMode.FILE_FLAG_FIRST_PIPE_INSTANCE
                 | (readable and dwOpenMode.PIPE_ACCESS_INBOUND or 0x00000000)
                 |
                 (writable and dwOpenMode.PIPE_ACCESS_OUTBOUND or 0x00000000))
    pipe_mode = (0x00000000
                 | (readable and dwPipeMode.PIPE_READMODE_BYTE or 0x00000000)
                 | (writable and dwPipeMode.PIPE_TYPE_BYTE or 0x00000000)
                 | dwPipeMode.PIPE_WAIT)
    # https://msdn.microsoft.com/en-US/library/windows/desktop/aa365150.aspx
    handle = _winapi.CreateNamedPipe(address, open_mode, pipe_mode, 1, BUFSIZE,
                                     BUFSIZE, timeout, 0x0)
    overlapped = _winapi.ConnectNamedPipe(handle, overlapped=True)

    if (nDefaultTimeOut.NMPWAIT_USE_DEFAULT_WAIT < timeout <
            nDefaultTimeOut.NMPWAIT_WAIT_FOREVER):
        timer = TimeoutTimer(timeout / 1000, overlapped.cancel)
    else:
        timer = TimeoutTimer(0, lambda: None)

    with timer:
        _, err = overlapped.GetOverlappedResult(True)  # Can block forever
        assert err == 0
    return PipeConnection(handle, readable=readable, writable=writable)
示例#3
0
文件: ipc.py 项目: pranavrajpal/mypy
 def __enter__(self) -> 'IPCServer':
     if sys.platform == 'win32':
         # NOTE: It is theoretically possible that this will hang forever if the
         # client never connects, though this can be "solved" by killing the server
         try:
             ov = _winapi.ConnectNamedPipe(self.connection, overlapped=True)
             # TODO: remove once typeshed supports Literal types
             assert isinstance(ov, _winapi.Overlapped)
         except OSError as e:
             # Don't raise if the client already exists, or the client already connected
             if e.winerror not in (_winapi.ERROR_PIPE_CONNECTED,
                                   _winapi.ERROR_NO_DATA):
                 raise
         else:
             try:
                 timeout = int(self.timeout *
                               1000) if self.timeout else _winapi.INFINITE
                 res = _winapi.WaitForSingleObject(ov.event, timeout)
                 assert res == _winapi.WAIT_OBJECT_0
             except BaseException:
                 ov.cancel()
                 _winapi.CloseHandle(self.connection)
                 raise
             _, err = ov.GetOverlappedResult(True)
             assert err == 0
     else:
         try:
             self.connection, _ = self.sock.accept()
         except socket.timeout as e:
             raise IPCException('The socket timed out') from e
     return self
    def start(self):
        # Create a named pipe which allows for asynchronous IO in Windows
        pipe_name =  r'\\.\pipe\typeperf_output_' + str(uuid.uuid4())

        open_mode =  _winapi.PIPE_ACCESS_INBOUND
        open_mode |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE
        open_mode |= _winapi.FILE_FLAG_OVERLAPPED

        # This is the read end of the pipe, where we will be grabbing output
        self.pipe = _winapi.CreateNamedPipe(
            pipe_name, open_mode, _winapi.PIPE_WAIT,
            1, BUFSIZE, BUFSIZE, _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL
        )
        # The write end of the pipe which is passed to the created process
        pipe_write_end = _winapi.CreateFile(
            pipe_name, _winapi.GENERIC_WRITE, 0, _winapi.NULL,
            _winapi.OPEN_EXISTING, 0, _winapi.NULL
        )
        # Open up the handle as a python file object so we can pass it to
        # subprocess
        command_stdout = msvcrt.open_osfhandle(pipe_write_end, 0)

        # Connect to the read end of the pipe in overlap/async mode
        overlap = _winapi.ConnectNamedPipe(self.pipe, overlapped=True)
        overlap.GetOverlappedResult(True)

        # Spawn off the load monitor
        counter_name = self._get_counter_name()
        command = ['typeperf', counter_name, '-si', str(SAMPLING_INTERVAL)]
        self.popen = subprocess.Popen(' '.join(command), stdout=command_stdout, cwd=support.SAVEDCWD)

        # Close our copy of the write end of the pipe
        os.close(command_stdout)
 async def accept(self):
     self._handle_queue.append(self._new_handle())
     handle = self._handle_queue.pop(0)
     try:
         ov = _winapi.ConnectNamedPipe(handle, overlapped=True)
     except OSError as e:
         if e.winerror != _winapi.ERROR_NO_DATA:
             raise
         # ERROR_NO_DATA can occur if a client has already connected,
         # written data and then disconnected -- see Issue 14725.
     else:
         try:
             # res = _winapi.WaitForMultipleObjects(
             #     [ov.event], False, INFINITE)
             await _wait_for_ov(ov)
         except:
             ov.cancel()
             _winapi.CloseHandle(handle)
             raise
         finally:
             _, err = ov.GetOverlappedResult(True)
             assert err == 0
     if self._wrap_ssl:
         return AsyncSslPipeConnection(handle, server_side=True)
     else:
         return AsyncPipeConnection(handle, server_side=True)
示例#6
0
 def __enter__(self) -> 'IPCServer':
     if sys.platform == 'win32':
         # NOTE: It is theoretically possible that this will hang forever if the
         # client never connects, though this can be "solved" by killing the server
         try:
             _winapi.ConnectNamedPipe(self.connection, _winapi.NULL)
         except WindowsError as e:
             if e.winerror == _winapi.ERROR_PIPE_CONNECTED:
                 pass  # The client already exists, which is fine.
     else:
         try:
             self.connection, _ = self.sock.accept()
         except socket.timeout:
             raise IPCException('The socket timed out')
     return self
示例#7
0
def pipe(*, duplex=False, overlapped=(True, True), bufsize=BUFSIZE):
    """Like os.pipe() but with overlapped support and using handles not fds."""
    address = tempfile.mktemp(prefix=r'\\.\pipe\python-pipe-{:d}-{:d}-'.format(
        os.getpid(), next(_mmap_counter)))

    if duplex:
        openmode = _winapi.PIPE_ACCESS_DUPLEX
        access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE
        obsize, ibsize = bufsize, bufsize
    else:
        openmode = _winapi.PIPE_ACCESS_INBOUND
        access = _winapi.GENERIC_WRITE
        obsize, ibsize = 0, bufsize

    openmode |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE

    if overlapped[0]:
        openmode |= _winapi.FILE_FLAG_OVERLAPPED

    if overlapped[1]:
        flags_and_attribs = _winapi.FILE_FLAG_OVERLAPPED
    else:
        flags_and_attribs = 0

    h1 = h2 = None
    try:
        h1 = _winapi.CreateNamedPipe(address, openmode, _winapi.PIPE_WAIT, 1,
                                     obsize, ibsize,
                                     _winapi.NMPWAIT_WAIT_FOREVER,
                                     _winapi.NULL)

        h2 = _winapi.CreateFile(address, access, 0, _winapi.NULL,
                                _winapi.OPEN_EXISTING, flags_and_attribs,
                                _winapi.NULL)

        ov = _winapi.ConnectNamedPipe(h1, overlapped=True)
        ov.GetOverlappedResult(True)
        return h1, h2
    except:
        if h1 is not None:
            _winapi.CloseHandle(h1)
        if h2 is not None:
            _winapi.CloseHandle(h2)
        raise
示例#8
0
 def accept(self):
     self._handle_queue.append(self._new_handle())
     handle = self._handle_queue.pop(0)
     try:
         ov = _winapi.ConnectNamedPipe(handle, overlapped=True)
     except OSError as e:
         if e.winerror != _winapi.ERROR_NO_DATA:
             raise
     else:
         try:
             res = _winapi.WaitForMultipleObjects([ov.event], False,
                                                  INFINITE)
         except:
             ov.cancel()
             _winapi.CloseHandle(handle)
             raise
         finally:
             _, err = ov.GetOverlappedResult(True)
             assert err == 0
     return PipeConnection(handle)
示例#9
0
    def Pipe(duplex=True):
        '''
        返回管道两端的一对连接对象
        Returns pair of connection objects at either end of a pipe
        '''
        address = arbitrary_address('AF_PIPE')
        if duplex:
            openmode = _winapi.PIPE_ACCESS_DUPLEX
            access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE
            obsize, ibsize = BUFSIZE, BUFSIZE
        else:
            openmode = _winapi.PIPE_ACCESS_INBOUND
            access = _winapi.GENERIC_WRITE
            obsize, ibsize = 0, BUFSIZE

        h1 = _winapi.CreateNamedPipe(
            address,
            openmode | _winapi.FILE_FLAG_OVERLAPPED
            | _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE,
            _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE
            | _winapi.PIPE_WAIT,
            1,
            obsize,
            ibsize,
            _winapi.NMPWAIT_WAIT_FOREVER,
            # default security descriptor: the handle cannot be inherited
            _winapi.NULL)
        h2 = _winapi.CreateFile(address, access, 0, _winapi.NULL,
                                _winapi.OPEN_EXISTING,
                                _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL)
        _winapi.SetNamedPipeHandleState(h2, _winapi.PIPE_READMODE_MESSAGE,
                                        None, None)

        overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True)
        _, err = overlapped.GetOverlappedResult(True)
        assert err == 0

        c1 = PipeConnection(h1, writable=duplex)
        c2 = PipeConnection(h2, readable=duplex)

        return c1, c2
示例#10
0
 def connect(self) -> BufferedIOBase:
     _winapi.ConnectNamedPipe(self._handle, _winapi.NULL)
     fd = msvcrt.open_osfhandle(self._handle, 0)
     self.file = os.fdopen(fd, 'w+b')
     return self.file