捕获外部过程输出

Capture external process output

本文关键字:输出 过程 外部      更新时间:2023-10-16

不要将其作为重复项关闭,因为与类似的问题相比,我有一个微妙但显著的变化:

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

我在7号窗户上跑步。

编辑:

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

丑陋,但可能有用。

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

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

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

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

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

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