Win32中,ReadFile的自管块甚至孩子后终止(Win32, ReadFile from pi

2019-06-25 01:20发布

我有一个简单的程序(C)是创建两个子进程,等待每一个继承的管道,并把输出的文件。

一切正常,只是在两个管部分写入/读取周期后,当孩子结束时,调用ReadFile的块,等待在管道上的数据。 我用下面的模式:

...
//create pipe1
CreatePipe(&hReadDup,&hWrite,&saAttr,0);
DuplicateHandle(GetCurrentProcess(),hReadDup,GetCurrentProcess(),&hRead,0,FALSE,DUPLICATE_SAME_ACCESS);
CloseHandle(hReadDup);


si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hWrite;   

CreateProcess(  NULL,
        const_cast<LPWSTR>(cmd2.c_str()), //the command to execute
        NULL,
        NULL,
        TRUE,
        0,
        NULL,
        NULL,
        &si, //si.
        &pi
    );

...
CloseHandle(hWrite); // EDIT: this was the operation not properly done!

while(cont){
    ...
    cont = ReadFile(hRead,buf,50, &actual,NULL);
    ...
}
... 

最后调用块(子进程退出后)。 为什么(如果没有,如何调试这一点)的想法?

Answer 1:

我发现了自己的解决方案(至极实际上是一个编码错误)。 我没有关闭管道正常(的父母写句柄hWrite ),因此,同步的ReadFile无法报告我回子进程终止。

如果有人有同样的问题,一定要在开始该管道的I / O操作之前关闭管道的可继承句柄(如MSDN报告,不能再次找到了)。



Answer 2:

您所呼叫ReadFile()在同步模式。 只要管打开时, ReadFile()将阻止等待更多的数据。 如果你离开打开进程和线程处理该CreateProcess()返回给你,这将防止子进程,从完全退出,所以管可能不会对孩子结束时关闭。 进入你的阅读循环之前,关闭句柄CreateProcess()返回,使管正常关闭时,子进程完全结束,然后ReadFile()会报告错误回给你当它不能从管道读了。 Alterntively,切换到重叠的I / O上的管,以便可以监视与所述子进程WaitForSingleObject()GetExitCodeProcess()而循环运行,所以当子进程终止不管管状态的则可以检测到。



Answer 3:

在你的情况都好,你有机会访问在管这两个进程。 然而,如果你没有,或者只是想中断ReadFile调用,然后CancelSynchronousIo是你的朋友: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363789(v=vs.85)。 ASPX



文章来源: Win32, ReadFile from pipe block even after child terminated