在JavaDoc for ProcessBuilder上它声明
创建进程的方法对于某些本机平台上的特殊进程可能不能很好地工作,例如本机窗口进程、守护进程、Win16 16/DOS进程 Microsoft Windows或shell脚本。
我的主要问题是,对于守护进程,ProcessBuilder不能很好地工作吗?那么ProcessBuilder并不适合作为一种可接受的方式来启动这些类型的应用程序呢?
谢谢!
发布于 2012-10-08 18:21:47
我的猜测(基于我在编码grep中发现的注释)是,问题在于您必须处理流程的流,而且这种处理可能是一个问题。
创建进程的方法对于某些本机平台上的特殊进程可能不能很好地工作,例如本机窗口进程、守护进程、Microsoft Windows上的Win16 16/DOS进程或shell脚本。创建的子进程没有自己的终端或控制台。它的所有标准I/O (即stdin、stdout、stderr)操作将通过三个流(getOutputStream()、getInputStream()、getErrorStream())重定向到父进程。父进程使用这些流向子进程输入并从子进程获取输出。由于一些本机平台只为标准输入和输出流提供有限的缓冲区大小,如果不及时写入输入流或读取子进程的输出流,可能会导致子进程阻塞,甚至导致死锁。
这也可能与以下事实有关:Process是一个抽象类,每个JRE/JDK都带有它自己的与平台相关的流程实现(例如UNIXProcess、WindowsProcess等)。有些操作系统可能只是具有与开放过程有关的限制,而Java在其文档中无法涵盖这些限制。
再说一遍-这只是猜测,代码并没有透露多少信息。
根据我的经验(无论是在*nix系统上还是在windows上)--在大多数情况下,您的代码需要在如何构造命令行、如何提供参数(无论是在arguments参数中还是在命令行中)以及如何构建派生进程的环境(继承您的进程的值或自己创建)方面,都需要在平台上有所了解。在任何情况下,这都是一场反复尝试的游戏。
https://stackoverflow.com/questions/12786413
复制相似问题