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

winapi – Win32 ReadFile从管道读取时挂起

发布时间:2020-12-14 02:09:49 所属栏目:Windows 来源:网络整理
导读:我正在创建一个子进程,并读取其输出.当子进程创建输出(cmd / c echo Hello World)时,我的代码工作正常,但是如果进程没有创建输出,则ReadFile将挂起(cmd / c echo Hello World output.txt).我只是在流程终止后才开始阅读. 我做错了什么吗?无论如何使用同步模
我正在创建一个子进程,并读取其输出.当子进程创建输出(cmd / c echo Hello World)时,我的代码工作正常,但是如果进程没有创建输出,则ReadFile将挂起(cmd / c echo Hello World> output.txt).我只是在流程终止后才开始阅读.

我做错了什么吗?无论如何使用同步模式执行此操作,还是必须使用异步模式?所有这一切都发生在一个单独的线程中,所以我不认为异步模式会给我任何好处,除非它是让这个工作的唯一方法.非常感谢!

saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL; 

CreatePipe(&g_hChildStd_OUT_Rd,&g_hChildStd_OUT_Wr,&saAttr,0);
SetHandleInformation(g_hChildStd_OUT_Rd,HANDLE_FLAG_INHERIT,0);

memset(&piProcInfo,sizeof(PROCESS_INFORMATION));
memset(&siStartInfo,sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO); 
siStartInfo.hStdError = g_hChildStd_OUT_Wr;
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL,commandWideString,NULL,TRUE,&siStartInfo,&piProcInfo);

while(1)
{
    GetExitCodeProcess(piProcInfo.hProcess,&processExitCode);
    if(processExitCode != STILL_ACTIVE)
        break;
    else
        Sleep(1);
}

*output = (char *)calloc(32,sizeof(char));
processOutputSize = 0;
while(1)
{
    bSuccess = ReadFile( g_hChildStd_OUT_Rd,processOutputTemp,32,&dwRead,NULL);
    if(!bSuccess || !dwRead)
        break;
    memcpy(*output + processOutputSize,dwRead);
    processOutputSize += dwRead;
    if(dwRead == 32)
        *output = (char *)realloc(*output,processOutputSize + 32);
    else
    {
        memset(*output + processOutputSize,1);
        break;
    }
}
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
CloseHandle(g_hChildStd_OUT_Rd);
CloseHandle(g_hChildStd_OUT_Wr);

解决方法

您将进程的输出重定向到管道,启动进程,等待它退出,然后读取输出.

问题是windows只缓存有限数量的数据.因此,您必须在进程仍在运行时读取管道,否则进程将被阻止,因为它无法向管道写入任何其他数据.

(编辑:李大同)

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

    推荐文章
      热点阅读