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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值