Win32 ReadFile hangs when reading from pipe

前端 未结 3 807
慢半拍i
慢半拍i 2021-01-05 07:10

I am creating a child process, and reading its output. My code works fine when the child process creates output (cmd /c echo Hello World), however ReadFile will

相关标签:
3条回答
  • 2021-01-05 07:47

    You redirect the output of the process to a pipe, start the process, wait till it exits, and then read the output.

    The problem is that windows buffers just a limited amount of data. So you must read the pipe while the process is still running, otherwise the process will be blocked because it cannot write any more data to the pipe.

    0 讨论(0)
  • 2021-01-05 07:47

    You should close the write end of the output pipe before you read from it, as @Marcus suggested in the comment.

    CloseHandle(g_hChildStd_OUT_Wr);

    For me this is the real answer.

    0 讨论(0)
  • 2021-01-05 07:56

    You could use PeekNamedPipe in a loop like this:

    for (;;)
    {
        DWORD bytesAvail = 0;
        if (!PeekNamedPipe(stdoutPipeRead, NULL, 0, NULL, &bytesAvail, NULL)) {
            std::cout << "Failed to call PeekNamedPipe" << std::endl;
        }
        if (bytesAvail) {
            CHAR buf[BUFSIZE];
            DWORD n;
            BOOL success = ReadFile(stdoutPipeRead, buf, BUFSIZE, &n, NULL);
            if (!success || n == 0) {
                std::cout << "Failed to call ReadFile" << std::endl;
            }
            std::cout << std::string(buf, buf + n);
        }
    }
    
    0 讨论(0)
提交回复
热议问题