加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 04:34:50 所属栏目:Windows 来源:网络整理
导读:我有一个简单的程序(在C中)创建两个子进程,等待每个继承的管道,并将输出放在一个文件中. 一切顺利,除了在两个管道上的一些写入/读取周期之后,当小孩结束时,调用ReadFile块,等待管道上的数据.我使用以下模式: ...//create pipe1CreatePipe(hReadDup,hWrite,s
我有一个简单的程序(在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无法回报子进程的终止.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读