V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linuxsteam
V2EX  ›  Java

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

  •  
  •   linuxsteam · 2022-05-24 15:35:45 +08:00 · 1163 次点击
    这是一个创建于 693 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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