首页 > 解决方案 > 在断开连接之前等待读取命名管道

问题描述

我有一个用 Python 编写的程序,我需要从 C++ 程序中联系它。我在 C++ 程序上创建管道服务器,客户端在 Python 中。每次我尝试不同的行为时,我都无法理解如何在两个程序之间正确读/写。请注意,我希望管道保持打开状态,以便将来进行多次读取/写入。

服务器 (C++)

#include <windows.h>
#include <iostream>
using namespace std;

#define FGPIPE TEXT("\\\\.\\pipe\\FGChroma")

int main()
{

    HANDLE hPipe;
    DWORD dwWritten;
    DWORD MAX_BUF_SIZE = 8;

    hPipe = CreateNamedPipe(FGPIPE,
                            PIPE_ACCESS_OUTBOUND,
                            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
                            2,
                            MAX_BUF_SIZE*16,
                            0,
                            NMPWAIT_USE_DEFAULT_WAIT,
                            NULL
                            );

    cout<<"Pipe? "<<hPipe<<endl;

    cout<<"Awaiting Connection"<<endl;
    cout<<ConnectNamedPipe(hPipe, NULL)<<endl;
    cout<<"Connected"<<endl;
    WriteFile(hPipe, "MSG1\n", 5, &dwWritten, NULL);
    WriteFile(hPipe, "MSG2\n", 5, &dwWritten, NULL);
    FlushFileBuffers(hPipe);
    ///Need to Wait for read here
    cout<<"Disconnecting"<<endl;
    DisconnectNamedPipe(hPipe);

}

客户端(Python)

f = open(r"\\.\\pipe\\FGChroma", 'r', 0)
while True:
    value = f.read()
    print(value)

当我尝试f.read()在 Python 中执行此操作时,我收到错误 OSError 22 Invalid Argument,这是公平的,因为我已经断开了管道。但是,如果我不断开管道,那么 Python 代码永远不会完成读取并一直等到管道关闭或断开连接。我觉得解决方案很简单,我只是错过了一些让我头疼的小东西。我阅读了命名管道和 Win API 的文档,我还尝试了 win32py 和其他替代方法,但我遇到了同样的问题;我不明白如何保持两个实例之间的连接并允许阅读而不必断开连接或等待阅读。

标签: pythonc++pipe

解决方案


我认为 Pythonf.read()和 Windows 管道存在问题。也许我错过了一些东西,但是当你像你一样读取管道时似乎没有 EOF,并且 pythonread()会读取结束并出错,即使它之前正确读取了所有内容。

要解决此问题,您可以使用缓冲管道 ( open(r"pipe", 'r')),然后一个接一个地读取字符 ( f.read(1)) 直到出现错误,或者使用os.read(f.fileno(), 1024)较低级别且在这种情况下有效的 。


推荐阅读