捕获stdout以获取远程进程的子进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了捕获stdout以获取远程进程的子进程相关的知识,希望对你有一定的参考价值。
目前正在处理我需要为外部进程的子进程捕获stdout / stderr的情况。对于这种情况,我需要一个命名管道吗?
我目前尝试过以下方法:
SECURITY_ATTRIBUTES saAttr;
HANDLE hStdOutRd = NULL;
HANDLE hStdOutWr = NULL;
HANDLE hDupStdOutWr = NULL;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&hStdOutRd, &hStdOutWr, &saAttr, 0) )
SetHandleInformation(hStdOutRd, HANDLE_FLAG_INHERIT, 0) )
HANDLE hExProc = OpenProcess(PROCESS_DUP_HANDLE, false, EXTERNAL_PROC);
DuplicateHandle(GetCurrentProcess(),
hStdOutWr,
hExProc,
&hDupStdOutWr,
0,
TRUE,
DUPLICATE_SAME_ACCESS);
// Child process for EXTERNAL_PROC executes and should inherit the duplicated handle
// Read from hStdOutRd
从管道读取时,它会挂起或不返回任何内容。我假设这是一个匿名管道,只适用于父子进程而不是外部进程。我宁愿不使用命名管道,是否可以将DuplicateHandle()管道从远程进程返回到我的进程然后访问数据?如果是这样,那会是什么样子?
答案
不,你不需要使用命名管道,匿名管道就可以了。 MSDN提供了捕获子进程输出的完整示例:
Creating a Child Process with Redirected Input and Output
以上是关于捕获stdout以获取远程进程的子进程的主要内容,如果未能解决你的问题,请参考以下文章
来自 apache 的子进程返回退出代码 -6 而不是 stdout 或 stderr