Logging 如何捕获正在运行的进程的stdout stderr输出

Logging 如何捕获正在运行的进程的stdout stderr输出,logging,trace,Logging,Trace,我需要编写一个程序,将同一台机器上其他运行进程的stdout/stderr输出捕获到一个变量中。 我想稍后将这些字节转换为其他字节,并对其执行任意操作,但这超出了本问题的范围 我的输入是一个PID列表,我们可以假设它们是有效的,并且实际上有使用这些PID运行的进程。我的目标是Linux,但如果回答中也提到了其他主机(如Windows),也将不胜感激 对于每个PID,每次带有该PID的进程写入stdout或stderr时,我都需要一个事件回调,它将该进程写入的原始字节(注意,如果多条消息被缓冲,这

我需要编写一个程序,将同一台机器上其他运行进程的stdout/stderr输出捕获到一个变量中。 我想稍后将这些字节转换为其他字节,并对其执行任意操作,但这超出了本问题的范围

我的输入是一个PID列表,我们可以假设它们是有效的,并且实际上有使用这些PID运行的进程。我的目标是Linux,但如果回答中也提到了其他主机(如Windows),也将不胜感激

对于每个PID,每次带有该PID的进程写入stdout或stderr时,我都需要一个事件回调,它将该进程写入的原始字节(注意,如果多条消息被缓冲,这很好)准确地转换为我可以使用的变量

我不在乎答案是什么,只要他们是主流的(C、C++、GO、Node.js等),就可以了。 关于堆栈溢出的类似问题建议将跟踪的进程作为捕获其stdout/stderr的进程的子进程运行。这不是我的用例。PID单独运行,不能作为子进程生成

其他类似的问题提供了使用现有的程序,如strace或gdb来完成这项工作。我知道怎么做,这不是我想要的。为编程语言使用库是可以的,但我不想添加单独的程序依赖项(转储现有开源程序的整个源代码也是不可能的……除非它们明确提供lib版本,例如curl和libcurl)

我想要一个答案,描述在任何主流编程语言中,使用PID或PID列表作为输入时,如何创建事件侦听器,以便在process/es使用这些PID/s写入stdout或stderr时调用回调

请注意,如果PID进程生成子进程或是多线程的,我希望能够从其生成的线程跟踪stdout/stderr


我目前正在阅读有关sys/ptrace.h linux api for C的文章,因为我认为这是本文的方向,但是如果有人已经有过这方面的经验,并且知道答案,请与大家分享。

是的,linux的答案是使用
ptrace
。如果你需要一些例子,看看strace是如何实现的。@melpomene是的,这就是我现在正在做的,只是想也许有人以前也做过类似的事情,在没有所有错误处理和纠结的情况下,对关键点有一个详细的了解是的,Linux的答案是使用
ptrace
。如果您需要示例,请查看
strace
是如何实现的。@melpomene是的,这就是我现在正在做的,只是想可能有人以前已经做过类似的事情,并且在没有所有错误处理和角落案例的情况下,对重要的关键点进行了详细说明