我有一个简单的程序(在C中)创建两个子进程,等待每个继承的管道,并将输出放在一个文件中.
一切顺利,除了在两个管道上的一些写入/读取周期之后,当小孩结束时,调用ReadFile块,等待管道上的数据.我使用以下模式:
... //create pipe1 CreatePipe(&hReadDup,&hWrite,&saAttr,0); DuplicateHandle(GetCurrentProcess(),hReadDup,GetCurrentProcess(),&hRead,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,&si,//si. &pi ); ... CloseHandle(hWrite); // EDIT: this was the operation not properly done! while(cont){ ... cont = ReadFile(hRead,buf,50,&actual,NULL); ... } ...
最后一次调用(子进程退出后)阻止.
想法为什么(如果没有,怎么调试这个)?
我自己找到了解决方案(实际上是一个编码错误).
我没有正确关闭管脚的写入句柄(hWrite),所以同步的ReadFile无法回报子进程的终止.
我没有正确关闭管脚的写入句柄(hWrite),所以同步的ReadFile无法回报子进程的终止.
如果有人遇到同样的问题,请确保在启动管道上的I / O操作之前关闭管道的可继承句柄(如MSDN报告,找不到).