Win32,ReadFile从管道块,甚至在子程序终止后

前端之家收集整理的这篇文章主要介绍了Win32,ReadFile从管道块,甚至在子程序终止后前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的程序(在C中)创建两个子进程,等待每个继承的管道,并将输出放在一个文件中.

一切顺利,除了在两个管道上的一些写入/读取周期之后,当小孩结束时,调用ReadFile块,等待管道上的数据.我使用以下模式:

  1. ...
  2. //create pipe1
  3. CreatePipe(&hReadDup,&hWrite,&saAttr,0);
  4. DuplicateHandle(GetCurrentProcess(),hReadDup,GetCurrentProcess(),&hRead,FALSE,DUPLICATE_SAME_ACCESS);
  5. CloseHandle(hReadDup);
  6.  
  7.  
  8. si.cb = sizeof(si);
  9. si.dwFlags = STARTF_USESTDHANDLES;
  10. si.hStdOutput = hWrite;
  11.  
  12. CreateProcess( NULL,const_cast<LPWSTR>(cmd2.c_str()),//the command to execute
  13. NULL,NULL,TRUE,&si,//si.
  14. &pi
  15. );
  16.  
  17. ...
  18. CloseHandle(hWrite); // EDIT: this was the operation not properly done!
  19.  
  20. while(cont){
  21. ...
  22. cont = ReadFile(hRead,buf,50,&actual,NULL);
  23. ...
  24. }
  25. ...

最后一次调用(子进程退出后)阻止.
想法为什么(如果没有,怎么调试这个)?

我自己找到了解决方案(实际上是一个编码错误).
我没有正确关闭管脚的写入句柄(hWrite),所以同步的ReadFile无法回报子进程的终止.

如果有人遇到同样的问题,请确保在启动管道上的I / O操作之前关闭管道的可继承句柄(如MSDN报告,找不到).

猜你在找的Windows相关文章