是否可以以编程方式捕获Linux上已运行进程的stdout(和stdin)? (也许将其重定向到管道?)
最好是解决方案在用户空间中工作(意味着不需要root权限)。
我见过an answer apparently using gdb,但我想在没有gdb的情况下这样做。
编辑:澄清:不,我无法访问代码,我也不想更改二进制文件,我希望解决方案可以在单独的进程中工作。无论如何,目标进程已经在运行。
答案 0 :(得分:4)
从流程内部(假设您可以在C中更改其代码),您可以尝试freopen(3),也许作为
FILE*newout = freopen("/some/path", "w", stdout);
if (!newout) { perror("freopen"); exit (EXIT_FAILURE); }
stdout = newout;
另见stdio(3)。 (否则dup2
STDOUT_FILENO
)。
从流程外部您可能会使用/proc/$PID/fd/
/proc/$PID/fd/0
,或重定向,或dup2(2) stdin的$PID
您的流程/proc/$PID/fd/1
的em>,流程$PID
的 stdout 的{{1}}等。有关详情,请参阅tee(1)。
答案 1 :(得分:2)
答案 2 :(得分:1)
如果您已经开始此过程,则可以使用gdb
实际重定向stdout
或strace
,以便拦截对write
et.al的调用。
如果您不想使用gdb
或strace
,您可能需要基本上做同样的事情。他们正在做的魔术是使用ptrace
函数来跟踪其他进程。这将要求您有权跟踪程序(也gdb
和strace
需要),作为普通用户,您无法跟踪其他用户的程序。
Linux Journal有一篇关于playing with ptrace的文章,展示了你如何做到这一点。需要注意的一点是,这将取决于平台:您必须专门为您正在使用的平台编写代码,该文章似乎有(32位)x86平台的示例。