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只缓存有限数量的数据.因此,您必须在进程仍在运行时读取管道,否则进程将被阻止,因为它无法向管道写入任何其他数据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |