2012-08-10 51 views
0

C++在Windows 我创建的cmd.exe的子进程,但是当我在读我的管道创建子进程

HANDLE parent = GetStdHandle(STD_OUTPUT_HANDLE); 
char buffer[BUFSIZE]; 
DWORD read, written; 
BOOL b = true; 

for(;;) 
{ 
    b = ReadFile(g_hChildStd_OUT_Rd, buffer, BUFSIZE, &read, NULL); 
    if(! b || read == 0) break; 

    b = WriteFile(parent, buffer, read, &written, NULL); 
    if(! b) break; 
} 

它打印从CMD.EXE输出在我的控制台就卡住但它挂在这个循环中。 我只需要弄清楚为什么它不会破环

+2

你检查什么B和阅读评估,以你读过的一切(虽然它的无限循环)后?做一点调试,你会找到你的答案。 – Pyrce 2012-08-10 18:46:37

+0

添加更多相关的标签,也画主题利弊的关注。这不是严格的C++问题(所有这些看起来都像C一样) - 更多的是Windows API问题。 – metal 2012-08-10 18:48:06

+0

它只是挂在ReadFile的,当管道是空 – birney 2012-08-10 18:49:16

回答

0

你的循环是无限的,因为b为总是正确的,因为ReadFile的和WriteFile总是成功的,你的情况和阅读永远不会为0

+0

有没有办法在读文件上设置超时? – birney 2012-08-10 19:21:33

+0

看看[SetCommTimeouts](http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437%28v=vs.85%29.aspx)函数。 – display101 2012-08-10 19:39:47

+0

@Keith:SetCommTimeouts,根据该文档,是用于串行端口,而不是为管道。 – 2012-08-10 21:43:18

1

你的代码在管道的写入结束关闭时写入应该退出,当最后一个句柄关闭时发生。如果子进程退出,则其管道写入结束的句柄将自动关闭。

你没有足够的代码让我确定,但最可能的原因是你没有关闭你的句柄到管道的写入结束。如果你在启动子进程后关闭句柄,你的代码应该工作。