【发布时间】:2026-01-07 17:10:01
【问题描述】:
我有一个简单的程序(用 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);
...
}
...
最后一次调用(子进程退出后)阻塞。 知道为什么(如果没有,如何调试)?
【问题讨论】:
-
感谢您的提问和回答。我一直在 _popen(...) 变体(在我的 Code::Blocks-GCC 环境中运行良好,但在我的工作环境中根本不运行)和您使用的 CreateProcess/CreatePipe 方法之间来回切换。您的实施效果很好。谢谢。
-
谢谢,今天遇到了这个!
标签: c pipe win32-process