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启动子进程时,默认会新建标准流给子进程用。