在ProcessBuilder的JavaDoc上,它说明了
创建进程的方法可能不适用于某些本机的特殊进程 平台,例如本机窗口进程,守护进程,Win16 / DOS进程 Microsoft Windows或shell脚本。
我的主要问题是ProcessBuilder与守护程序进程不兼容?那么ProcessBuilder不能成为启动这些类型应用程序的可接受方式吗?
谢谢!
答案 0 :(得分:1)
我的猜测(基于我在code grep中发现的评论)是问题在于您必须处理流程流并且此处理可能是一个问题。
创建流程的方法可能不适用于特殊方法 某些本机平台上的进程,例如本机窗口 进程,守护程序进程,Microsoft Windows上的Win16 / DOS进程, 或shell脚本。创建的子流程没有自己的子流程 终端或控制台。所有标准I / O(即stdin,stdout,stderr) 操作将通过三个重定向到父进程 streams(getOutputStream(),getInputStream(),getErrorStream())。该 父进程使用这些流来输入和输出 子流程。因为某些本机平台仅提供有限的 标准输入和输出流的缓冲区大小,无法及时 写入输入流或读取子进程的输出流可能 导致子进程阻塞,甚至死锁。
这也可能与Process
是一个抽象类的事实有关,每个JRE / JDK都带有它自己的平台相关流程实现(例如UNIXProcess
,WindowsProcess
等。 )有些操作系统可能只是有一些与Java无法在其文档中涵盖的打开过程相关的限制。
再次 - 这只是一个猜测,代码没有透露太多。
根据我的经验(在* nix系统和Windows上) - 您的代码需要在构建命令行的大部分时间都是平台感知的,如何提供参数(在arguments
参数中或在命令行中)以及如何构建生成进程的环境(继承进程的值或自己创建)。无论如何,这更像是一场反复试验的游戏。