Java启动子进程,子进程又启动孙进程后,Java在InputStream inputStream = process.getInputStream();中读取时,何时会返回null?

Java启动子进程,子进程又启动孙进程后,Java在InputStream inputStream = process.getInputStream();中读取时,何时会返回null?

情况1:
如果java启动的是python命令行进程,而python又用subprocess.Popen启动子进程:


如果subprocess.Popen启动子进程时没有带close_fds=True参数,只有python进程和孙进程都退出时,才会返回null。

如果subprocess.Popen启动子进程时带close_fds=True参数,当孙进程是控制台进程,只有python进程和孙进程都退出时,才会返回null。

如果subprocess.Popen启动子进程时带close_fds=True参数,当孙进程是非控制台进程,只要python进程退出,就会返回null,而不需要孙进程退出。

 

情况2:

如果java启动的不是python进程,而是一个普通的控制台程序,情况和上面的一致。也就是说,普通的控制台程序和python命令行进程等价的。


情况3:
如果java启动的是非控制台程序,再由这个非控制台程序去启动控制台和非控制台,情况和上面一致。

 

总结一下:

不管子进程是什么进程,只要孙进程是控制台程序,那么只有子进程和孙进程都退出,读取时才会返回null。
当孙进程是非控制台程序时,只要bInheritHandles为FALSE,此时只要子进程退出读取时就可以返回null了,不需要孙进程退出。


由此得出原理(为啥没见过书上这么写过):

只有拥有这个流的所有进程都退出,流才会返回null。

只要bInheritHandles为TRUE,子进程就会继承父进程的标准流。

如果bInheritHandles为FALSE,当子进程是控制台程序时仍然会继承父进程的标准流。而非控制台程序就不会继承了,而是新建自己的标准流。

 

注:Java启动子进程时,默认会新建标准流给子进程用。

 

你可能感兴趣的:(Java启动子进程,子进程又启动孙进程后,Java在InputStream inputStream = process.getInputStream();中读取时,何时会返回null?)