不要将它作为重复关闭,因为我从类似的问题中得到了一个微妙但重要的变化:
是否有可能在java中捕获外部进程(即stdout)的输出,当我没有创建进程时,我所知道的只是进程名称?
我在Windows 7上运行。
修改
如果有办法用其他语言(C#\ C ++),那么我可以写一个“CaptureOutput”程序捕获输出,写入stdout,并在我的java代码中启动“CaptureOutput”并读取它的stdput。
丑陋,但可能会奏效。
所以其他语言的答案也适合我。
答案 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读取/使用给定相同文件的数据。希望我接近回答,如果有的话。