【问题标题】:How to send commands to a subprocess如何向子进程发送命令
【发布时间】:2012-05-16 04:11:54
【问题描述】:

我正在创建一个模拟系统,该系统由一个使用 ProcessBuilder 创建多个流程的测试工具组成。我希望能够向单独的进程发送多个命令,但我只想到了几个选项 - 这两个选项看起来都不是很有趣。

第一种方法是使用套接字在父进程和子进程之间进行通信,这是子进程相互通信的方式。另一种是使用 Writer 方法,我一直在使用 Reader 方法来读取和打印每个进程的输入流。我认为这两者都需要类似的簿记水平。理想情况下,像调用任何子类一样调用函数会很好,但我知道这不是多进程的工作方式。

请让我知道您认为最好的实现方式是什么!

谢谢, 大卫

更新:我最终在测试工具中创建了一个与所有子进程通信的服务器套接字。系统设置好后,只需将消息添加到队列中,然后将其发送到正确的客户端。

【问题讨论】:

  • 对我来说,不清楚你想达到什么。您可以在 Java 中生成多个线程,每个线程都可以启动一个子进程。也许您不需要子进程,但可以完全用 Java 完成?
  • 由于我正在模拟一个将在三台不同的计算机上运行的系统,因此要求它们是独立的进程

标签: java subprocess multiprocessing processbuilder


【解决方案1】:

这个答案是对你的陈述的回应:

“理想情况下,像调用任何函数一样调用函数会很好 子类,但我知道这不是多进程的工作方式。”

如果您愿意,如果子进程是在 JVM 上运行的 Java 程序,那么您可以这样做:

使用Remote Method Invocationwikipedia article 有一个 RMI 服务器和客户端的小例子。

本质上,它的工作方式如下:

  1. 服务器提供一些服务,通过远程方法,通过实现一个“远程接口”(其定义也应该在客户端可用)
  2. 当服务器启动时,它会创建一个实现服务的对象实例,并将其“绑定”到“RMI 注册表”
  3. 客户端在“RMI Registry”中查找它想要调用方法的远程对象,并获得一个似乎实现远程接口的对象。
  4. 然后客户端可以调用此对象的方法,RMI 运行时确保调用到达远程对象,并返回结果。

这似乎是一个“官方”的 Hello World 示例: http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html

调用的参数必须是Serializable(以便它们可以通过网络传输)。通常,这应该像将implements Serializable 附加到它们的类型定义一样简单。

【讨论】:

  • 作为一个相对新手的程序员,我必须说这一切看起来都相当复杂。这个概念听起来可行,但我可能需要一段时间才能确定这是否适合我。
  • @DavidK - 从本质上讲,RMI 抽象了所有“进程间通信”的东西,以允许您(在一些设置之后)几乎像调用“远程”JVM 上的“远程”对象一样如果它是本地对象。我什至发布此答案的原因是因为您表达了对“调用函数”的偏好。它可能是也可能不是解决您问题的最佳方法。
猜你喜欢
  • 2015-02-04
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2011-08-25
  • 2012-06-26
相关资源
最近更新 更多