Java Runtime.exec 是管道还是重定向? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linuxsteam
V2EX    Java

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

  •  
  •   linuxsteam 2022 年 5 月 24 日 1734 次点击
    这是一个创建于 1433 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    9 条回复    2022-05-26 10:04:36 +08:00
    AoEiuV020CN
        1
    AoEiuV020CN  
       2022 年 5 月 24 日
    仔细回忆了一下“管道”和“重定向”,没明白楼主为什么会联想到这两个词,这不都是针对 shell 组合多个进程输入输出情况的描述吗,
    java 这边不就是 exec 产生新进程,getOutputStream 得到新进程输出流,getInputStream 得到新进程输入流,
    后续怎么 io 操作都随意,不管是管道还是重定向都可以模拟的,编程语言比 shell 自由多了,
    想不明白是哪一步让楼主开始纠结管道和重定向,
    AoEiuV020CN
        2
    AoEiuV020CN  
       2022 年 5 月 24 日
    @AoEiuV020CN #1 反了反了,getOutputStream 是新进程的输入流,getInputStream 才是新进程的标准输出流,
    AoEiuV020CN
        3
    AoEiuV020CN  
       2022 年 5 月 24 日
    诶,从功能上理解的话,这里相当于存在一个管道,getOutputStream 得到的是管道的输出端,而管道的输入端则是新进程的输入,
    往 getOutputStream 输入数据就会通过管道被新进程的标签输入流读取到,
    是这意思?
        4
    linuxsteam  
    OP
       2022 年 5 月 24 日
    @AoEiuV020CN 是的 我这方面基础比较辣鸡
    我看了讲述管道的文章。中心思想 是两个进程通过一个管道进行传输标准流。
    我目前没有发现这个管道。所以我认为就是 Java 进程启动其他进程。并且将其他进程的标准流重定向到 Java 进程中
    ysc3839
        5
    ysc3839  
       2022 年 5 月 24 日 via Android
    管道和“重定向”是两个概念。假设此处所说的“重定向”意思是修改进程 stdin/stdout/stderr 所对应的文件或设备。
    那其实很好理解嘛,有三个变量,名字分别叫 stdin, stdout, stderr ,一般情况下这三个变量里存的是 tty 的信息,程序使用“tty 的信息”进行读写时,数据就从 tty 对端获取、或者被传输到 tty 的对端。现在我不想让数据来自或发往 tty ,我想让数据来自或写到文件,那我可以把这三个变量里面存的东西改成某个文件的信息,这就叫重定向。
    然后我想让目标进程直接把数据传给我的程序,不想经过文件,怎么办?可以用管道,往管道的一端写入数据,另一端可以读取出数据,数据被读取后不会继续存在管道中,也不需要文件做中转。把上述三个变量里面存的东西改成管道的信息,就是重定向+管道。
    codehz
        6
    codehz  
       2022 年 5 月 25 日
    获取输出流这个操作,对应的实现,那十有八九就是 pipe ,也就是管道管道是区分于普通文件的
    所谓重定向,那就意味着,原先有一个预定义的方向:继承父进程的输入、输出、错误流,如果保留默认设置,就自然没办法截获输出和提供输入了
    所以这个意义上,Runtime.exec 默认情况既用了管道,也用了重定向(
    但是你这么问肯定是因为概念上混淆了,通常管道,重定向这个说法是 shell 里对应|和< >这些的,但是看起来你还是没学好:即使是 shell ,在用管道的时候也会用到重定向这个术语的(只是通常省略不说)。。
    linuxsteam
        7
    linuxsteam  
    OP
       2022 年 5 月 25 日
    @codehz 这么说来 重定向 指的是通过文件交互的?
    但是 Runtime.exec 实际调用的是 ProcessBuilder 呀,processBuilder 有个 redirectErrorStream(bool ) 这样的参数。JDK 应该不会写到文件 再用另一个进程去读取吧。。
    codehz
        8
    codehz  
       2022 年 5 月 25 日
    @linuxsteam 管道也是“文件”的一种啊)
    linuxsteam
        9
    linuxsteam  
    OP
       2022 年 5 月 26 日
    @codehz 是的 我后来看的书中都说是 伪文件 属于文件系统
    关于     帮助文档    自助推广系统     博客     API     FAQ     Solana     1934 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 16:13 PVG 00:13 LAX 09:13 JFK 12:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86