以编程方式重定向正在运行的进程的stdout?

时间:2013-10-25 08:26:49

标签: c linux

是否可以以编程方式捕获Linux上已运行进程的stdout(和stdin)? (也许将其重定向到管道?)

最好是解决方案在用户空间中工作(意味着不需要root权限)。

我见过an answer apparently using gdb,但我想在没有gdb的情况下这样做。

编辑:澄清:不,我无法访问代码,我也不想更改二进制文件,我希望解决方案可以在单独的进程中工作。无论如何,目标进程已经在运行。

3 个答案:

答案 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实际重定向stdoutstrace,以便拦截对write et.al的调用。

如果您不想使用gdbstrace,您可能需要基本上做同样的事情。他们正在做的魔术是使用ptrace函数来跟踪其他进程。这将要求您有权跟踪程序(也gdbstrace需要),作为普通用户,您无法跟踪其他用户的程序。

Linux Journal有一篇关于playing with ptrace的文章,展示了你如何做到这一点。需要注意的一点是,这将取决于平台:您必须专门为您正在使用的平台编写代码,该文章似乎有(32位)x86平台的示例。