[英]ReadFile from anonymous pipe doesn't return after the child process exited
I'm trying to get the output of a child process and parse it. 我正在尝试获取子进程的输出并进行解析。
this is my code : 这是我的代码:
DWORD Invoker::InvokeAndOutput() {
wchar_t *cmd_line = _wcsdup(command_line.c_str());
wchar_t *cwd_path = _wcsdup(cwd.c_str());
HANDLE pipe_read , pipe_write;
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&pipe_read,&pipe_write,&saAttr,0);
SetHandleInformation(pipe_read,HANDLE_FLAG_INHERIT,0);
STARTUPINFOW startup_info = {0};
startup_info.cb = sizeof(startup_info);
startup_info.hStdOutput = pipe_write;
startup_info.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION proc_info = {0};
CreateProcessW(0,cmd_line,0,0,TRUE,0,0,cwd_path,&startup_info,&proc_info);
char buffer[1000] = {0};
BOOL result;
DWORD read;
while(1) {
memset(buffer,0,1000);
result = ReadFile(pipe_read,buffer,1000,&read,0);
if (!result || !read) break; // the execution doesn't get here after the child process exited
else MessageBoxA(0,buffer,0,0);
}
WaitForSingleObject(proc_info.hProcess,INFINITE);
DWORD exit_code;
if (!GetExitCodeProcess(proc_info.hProcess,&exit_code)) return -1;
return exit_code;
}
I saw in some questions that I needed to close the handles of the pipes in the parent process so I tried this : 我在某些问题中看到需要在父进程中关闭管道的句柄,因此我尝试了以下操作:
CreateProcessW(0,cmd_line,0,0,TRUE,0,0,cwd_path,&startup_info,&proc_info);
CloseHandle(pipe_read);
but now I can't get the output from the child process. 但是现在我无法从子进程中获取输出。
any help will be welcome. 任何帮助都将受到欢迎。
The problem was solved , I had to close the write end only 问题解决了,我只需要关闭写端
CreateProcessW(0,cmd_line,0,0,TRUE,0,0,cwd_path,&startup_info,&proc_info);
//CloseHandle(pipe_read);
CloseHandle(pipe_write);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.