4

在 ProcessBuilder 的 JavaDoc 上它指出

创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程、守护进程、
Microsoft Windows 上的 Win16/DOS 进程或 shell 脚本。

我的主要问题是 ProcessBuilder 不能很好地与守护进程一起工作吗?ProcessBuilder 不适合作为启动这些类型应用程序的可接受方式怎么办?

谢谢!

4

1 回答 1

1

我的猜测(基于我在代码 grep中找到的注释)是问题在于您必须处理流程的流,并且这种处理可能是一个问题。

创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程、守护进程、Microsoft Windows 上的 Win16/DOS 进程或 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准I/O(即stdin、stdout、stderr)操作都会通过三个流(getOutputStream()、getInputStream()、getErrorStream())重定向到父进程。父进程使用这些流向子进程提供输入并从子进程获取输出。由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

它也可能与作为一个抽象类的事实有关,Process并且每个 JRE/JDK 都带有它自己的平台相关进程实现(例如UNIXProcessWindowsProcess等等)。某些操作系统可能只是具有与 Java 无法涵盖的打开进程相关的限制。文档。

再次 - 这只是一个猜测,代码并没有透露太多。

根据我的经验(在 *nix 系统和 Windows 上) - 您的代码大部分时间都需要在如何构建命令行、如何提供参数(在arguments参数中或在命令行中)以及如何提供参数方面具有平台意识构建衍生进程的环境(继承进程的值或自行创建)。无论如何,这更像是一场试错的游戏。

于 2012-10-08T18:21:47.637 回答