经过研究,我注意到使用 java 的 ProcessBuilder 的“正确”方法是生成另外两个线程来管理吞噬新创建的进程的 stdout/stderr,这样它就不会像这里所示的那样挂起: javaworld 文章
但这让我想知道 2 个问题 - 1.) 为什么需要单独的进程而不是让父进程吞噬 stdout 然后依次获取 stderr?
2.) 此外,如果您要将流重定向到两者都转到标准输出,是否可以让父进程吞下标准输出流,然后不必担心死锁?
经过研究,我注意到使用 java 的 ProcessBuilder 的“正确”方法是生成另外两个线程来管理吞噬新创建的进程的 stdout/stderr,这样它就不会像这里所示的那样挂起: javaworld 文章
但这让我想知道 2 个问题 - 1.) 为什么需要单独的进程而不是让父进程吞噬 stdout 然后依次获取 stderr?
2.) 此外,如果您要将流重定向到两者都转到标准输出,是否可以让父进程吞下标准输出流,然后不必担心死锁?
注意你的条件。线程不是进程。
因为孩子可以写入两者,并且当缓冲区stderr
已满时您会遇到死锁(孩子等待父母阅读stderr
,父母等待孩子关闭stdout
)。
不。如果子进程也需要stdin
,那么您必须stdin
在主线程中处理并通过额外的线程读取合并的输出流,否则您可能会再次出现死锁(子进程等待父进程读取输出流,父进程等待子进程读取数据stdin
)。