捕获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

如何在unittest中捕获python子进程stdout

管道时在python的子进程模块中使用stdout.close()

Python从完成的子进程中获取环境