捕获外部过程输出

时间:2012-08-01 13:20:42

标签: c# java c++ process stdout

不要将它作为重复关闭,因为我从类似的问题中得到了一个微妙但重要的变化:

是否有可能在java中捕获外部进程(即stdout)的输出,当我没有创建进程时,我所知道的只是进程名称?

我在Windows 7上运行。

修改

如果有办法用其他语言(C#\ C ++),那么我可以写一个“CaptureOutput”程序捕获输出,写入stdout,并在我的java代码中启动“CaptureOutput”并读取它的stdput。

丑陋,但可能会奏效。

所以其他语言的答案也适合我。

4 个答案:

答案 0 :(得分:1)

首先让我说你要问的是打破过程隔离的所有规则。 如果您的进程没有创建要捕获其输出的进程,并且您也无权修改调用进程(命令shell?服务管理器?您还没有说明哪个)。那么你唯一的机会,也就是最简单的机会,就是在进程中注入一个线程,当所有其他线程都被挂起时,改变全局stdout(和stderr?)。这只能通过对目标进程具有完全访问权限的进程来完成。在跑步过程中进行这样的手术并不适合胆小的人。

答案 1 :(得分:1)

你要做的事情非常危险。很容易意外地破坏你想要进入的过程的记忆。测试,测试,测试。然后再测试一下。祝你好运 - 我知道我不想把它拉掉。

本文 - API Hooking - 解释如何开始使用您想要的内容(使用C ++)。将代码注入正在运行的进程后,还有其他Windows API调用来替换STDOUT(例如SetStdHandle)。

答案 2 :(得分:0)

您是否可以控制流程何时开始?如果是这样,您可以启动该进程并将其stdout传输到可以读取的文件或您编写的另一个程序,该程序可以将其记录在数据库,事件查看器等中。

答案 3 :(得分:0)

在Linux下,查看操作系统的IPC机制,例如消息队列,管道,共享内存和套接字。这些机制允许Inter-process communication。虽然,如果您对程序的输出特别感兴趣,解决方法可能只是让第一个进程将数据输出到磁盘上的文件,并使用单独的进程读取。通过这种方式,您可以使用多种语言执行任务。一个简单的例子是让C ++将一些数据写入文件,并使用JAVA读取/使用给定相同文件的数据。希望我接近回答,如果有的话。