Java Runtime.exec 是管道还是重定向?

2022-05-24 15:35:45 +08:00
 linuxsteam

如题。 小弟看了许多文章,无法确定

在进程里没有发现管道的创建。个人偏向怀疑是重定向

1278 次点击
所在节点    Java
9 条回复
AoEiuV020CN
2022-05-24 16:02:35 +08:00
仔细回忆了一下“管道”和“重定向”,没明白楼主为什么会联想到这两个词,这不都是针对 shell 组合多个进程输入输出情况的描述吗,
java 这边不就是 exec 产生新进程,getOutputStream 得到新进程输出流,getInputStream 得到新进程输入流,
后续怎么 io 操作都随意,不管是管道还是重定向都可以模拟的,编程语言比 shell 自由多了,
想不明白是哪一步让楼主开始纠结管道和重定向,
AoEiuV020CN
2022-05-24 16:04:35 +08:00
@AoEiuV020CN #1 反了反了,getOutputStream 是新进程的输入流,getInputStream 才是新进程的标准输出流,
AoEiuV020CN
2022-05-24 16:08:08 +08:00
诶,从功能上理解的话,这里相当于存在一个管道,getOutputStream 得到的是管道的输出端,而管道的输入端则是新进程的输入,
往 getOutputStream 输入数据就会通过管道被新进程的标签输入流读取到,
是这意思?
linuxsteam
2022-05-24 16:12:19 +08:00
@AoEiuV020CN 是的 我这方面基础比较辣鸡
我看了讲述管道的文章。中心思想 是两个进程通过一个管道进行传输标准流。
我目前没有发现这个管道。所以我认为就是 Java 进程启动其他进程。并且将其他进程的标准流重定向到 Java 进程中
ysc3839
2022-05-24 20:12:08 +08:00
管道和“重定向”是两个概念。假设此处所说的“重定向”意思是修改进程 stdin/stdout/stderr 所对应的文件或设备。
那其实很好理解嘛,有三个变量,名字分别叫 stdin, stdout, stderr ,一般情况下这三个变量里存的是 tty 的信息,程序使用“tty 的信息”进行读写时,数据就从 tty 对端获取、或者被传输到 tty 的对端。现在我不想让数据来自或发往 tty ,我想让数据来自或写到文件,那我可以把这三个变量里面存的东西改成某个文件的信息,这就叫重定向。
然后我想让目标进程直接把数据传给我的程序,不想经过文件,怎么办?可以用管道,往管道的一端写入数据,另一端可以读取出数据,数据被读取后不会继续存在管道中,也不需要文件做中转。把上述三个变量里面存的东西改成管道的信息,就是重定向+管道。
codehz
2022-05-25 06:21:36 +08:00
获取输出流这个操作,对应的实现,那十有八九就是 pipe ,也就是管道——管道是区分于普通文件的
所谓重定向,那就意味着,原先有一个预定义的方向:继承父进程的输入、输出、错误流,如果保留默认设置,就自然没办法截获输出和提供输入了
所以这个意义上,Runtime.exec 默认情况既用了管道,也用了重定向(
但是你这么问肯定是因为概念上混淆了,通常管道,重定向这个说法是 shell 里对应|和< >这些的,但是看起来你还是没学好:即使是 shell ,在用管道的时候也会用到重定向这个术语的(只是通常省略不说)。。
linuxsteam
2022-05-25 16:14:39 +08:00
@codehz 这么说来 重定向 指的是通过文件交互的?
但是 Runtime.exec 实际调用的是 ProcessBuilder 呀,processBuilder 有个 redirectErrorStream(bool ) 这样的参数。JDK 应该不会写到文件 再用另一个进程去读取吧。。
codehz
2022-05-25 22:36:20 +08:00
@linuxsteam 管道也是“文件”的一种啊)
linuxsteam
2022-05-26 10:04:36 +08:00
@codehz 是的 我后来看的书中都说是 伪文件 属于文件系统

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854979

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX