捕获外部进程输出

8
不要将其关闭为重复问题,因为我与类似问题有微妙但重要的改变:
当我没有创建进程且所有我知道的只有进程名称时,是否可能在Java中捕获外部进程(即stdout)的输出?
我正在运行Windows 7。
编辑:
如果有其他语言(C#\ C ++)可以做到这一点,那么我可以编写一个“CaptureOutput”程序来捕获输出,写入stdout,并在我的Java代码中启动“CaptureOutput”并读取其stdput。
很难看,但可能有效。
因此,用其他语言回答对我也没问题。

@amicngh 我正在使用 Windows 7 运行。 - sara
你是否可以从任何地方访问其他进程,例如Java? - amicngh
@amicngh 抱歉,我不明白你的意思... - sara
4个回答

1

你正在尝试做的事情非常危险。很容易意外破坏你想要进入的进程的内存。测试,测试,再测试。然后再多测试一些。祝你好运 - 我知道我不想去完成这个任务。

这篇文章 - API Hooking - 解释了如何开始你想要的内容(使用C++)。一旦你将代码注入到正在运行的进程中,就有其他Windows API调用来替换STDOUT(例如SetStdHandle)。


1

首先,我要说的是,你所要求的违反了所有的过程隔离规则。如果您的进程没有创建产生所需捕获输出的进程,并且您也无法访问修改调用进程(命令行?服务管理器?您没有说明),那么您唯一的机会就是向该进程注入一个线程,在其所有其他线程被挂起时,更改全局stdout(和stderr?)。这只能由具有对目标进程完全访问权限的进程完成。在运行中的进程上执行此类手术并不适合胆小者。


另一个极端的选择是提取有关进程的所有运行时信息,终止原始进程并使用所需的重定向启动自己的副本。虽然这样做可能会受到谴责... - dex black
更多的参考资料等待着热心/急切的查询者。 - dex black
使用在codeproject中提到的SetStdHandle和三种将代码注入到另一个进程的方法的组合可能会让你实现目标。但我必须强调“可能会让你实现目标”。 很抱歉,我必须说这只是个坏主意。寻找日志文件解决方案或与程序开发人员、系统管理员等进行交流。 - dex black

0
在Linux下,可以查看操作系统的IPC机制,例如消息队列、管道、共享内存和套接字。这些机制允许进行进程间通信。虽然,如果您特别关注程序的输出,一个解决方法就是让第一个进程将数据输出到磁盘上的文件中,并由另一个进程读取。通过这种方式,您可以使用多种语言完成任务。一个简单的例子是让C++将一些数据写入文件,然后使用JAVA读取/使用相同的文件中的数据。希望我能够回答您的问题,即使只是部分回答。

0
你能控制进程何时启动吗?如果可以的话,你可以启动进程并将其stdout导向一个文件,该文件可以被读取或者传递给你编写的另一个程序,该程序可以将其记录在数据库、事件查看器等中。

不,我没有控制权。就像我说的那样:我没有创建这个进程。 - sara
你能编译这个其他的进程吗? - RichardJohnn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接