8

不要将其关闭为重复,因为我对类似问题有一个微妙但重大的变化:

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

我在 Windows 7 上运行。

编辑:

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

丑陋,但可能会奏效。

所以用其他语言回答我也可以。

4

4 回答 4

1

首先让我说你的要求打破了进程隔离的所有规则。如果您的进程没有创建要捕获其输出的进程,并且您也无权修改调用进程(命令外壳?服务管理器?您没有说哪个)。那么你唯一的机会,充其量是一个渺茫的机会,就是将一个线程注入进程,而它的所有其他线程都被挂起,改变全局标准输出(和标准错误?)。这只能由对目标进程具有完全访问权限的进程来完成。对正在运行的进程执行此类手术不适合胆小的人。

于 2012-08-12T00:03:01.093 回答
1

您正在尝试做的事情非常危险。意外破坏您尝试进入的进程的内存非常容易。测试,测试,测试。然后再测试一些。祝你好运——我知道我不想这样做。

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

于 2012-09-27T19:54:22.557 回答
0

您可以控制流程何时开始吗?如果是这样,您可以启动该过程并将其标准输出通过管道传输到可以读取的文件或您编写的可以将其记录到数据库、事件查看器等中的另一个程序。

于 2012-08-02T12:38:55.900 回答
0

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

于 2012-09-15T11:59:06.797 回答