让管道与cat和T形三通一起工作 我正在为C++ UNIX shell实现管道,但是我对如何执行这些命令感到迷惑。

让管道与cat和T形三通一起工作 我正在为C++ UNIX shell实现管道,但是我对如何执行这些命令感到迷惑。,unix,pipe,Unix,Pipe,假设我有这个命令: cat < inputfile.txt | tee outputfile.txt > outputfile2.txt catoutputfile2.txt 我已经解析成一个以NULL结尾的c字符串数组 我应该如何执行此命令?我是否从头到尾检查数组,每当我看到“”或“|”时,都会按照它们的顺序执行正确的命令?或者我: 首先查找“|” 执行左边的内容(cat输出中吐出第一个管道符号)。在您的示例中,将创建管道。您为左侧子进程(LH)分叉,并安排标准输出到管道。然

假设我有这个命令:

 cat < inputfile.txt | tee outputfile.txt > outputfile2.txt
catoutputfile2.txt
我已经解析成一个以NULL结尾的c字符串数组

我应该如何执行此命令?我是否从头到尾检查数组,每当我看到“”或“|”时,都会按照它们的顺序执行正确的命令?或者我:

  • 首先查找“|”
  • 执行左边的内容(cat
  • 执行'>'(tee outputfile.txt)前面右边的内容,并从管道中读取它
  • 从outputfile.txt读取outputfile2.txt

  • 您当然需要在管道处拆分(注意不要在
    echo“notthis | symbol”| cat>输出
    中吐出第一个管道符号)。在您的示例中,将创建管道。您为左侧子进程(LH)分叉,并安排标准输出到管道。然后处理命令、参数和I/O重定向,注意
    的工作原理与更传统的
    cat
    相同。如果存在输出重定向,则会覆盖管道。然后
    exec cat
    。RH儿童也经历了类似的过程

    同时,父进程需要关闭管道的两端(它不打算读或写它),并等待子进程(特别是RH子进程,管道中的最后一个进程)完成。在将相关端复制到标准输入或输出后,子对象将关闭管道的两端。(未关闭足够的文件描述符是故障的主要原因!)


    这与您描述的并没有什么不同,尽管您的步骤4编写时有点可疑,并且步骤3需要在
    exec*()

    看起来您已经找到了解决方案之前处理输出重定向。问题是什么?编辑:从左到右运行显然不起作用,因为当您执行
    cat
    二进制文件时,将其输入重定向到文件已经太晚了。我不确定它是否起作用您肯定需要在管道处拆分(注意不要在
    echo“不是这个|符号”中吐出第一个管道符号)| cat>输出
    )。在您的示例中,将创建管道。您为左侧子进程(LH)分叉,并安排标准输出到管道。然后处理命令、参数和I/O重定向,注意
    的工作原理与更传统的
    cat
    相同。如果存在输出重定向,则会覆盖管道。然后执行
    cat
    。RH儿童也经历了类似的过程。[…continued…][…continuence…]同时,父进程需要关闭管道的两端(它不打算读或写它),并等待子进程(特别是RH子进程,管道中的最后一个进程)完成。在将相关端复制到标准输入或输出后,子对象将关闭管道的两端。(没有关闭足够的文件描述符是问题的主要原因!)这与您描述的并没有太大区别,尽管您的第4步写得有点可疑,第3步需要在
    exec*()
    @JonathanLeffler:也许您应该将其作为一个答案发布:)