gpt4 book ai didi

linux - Shell如何以编程方式实现管道?

转载 作者:可可西里 更新时间:2023-11-01 11:46:16 26 4
gpt4 key购买 nike

我了解 I/O 重定向在 Unix/Linux 中的工作原理,并且我知道 Shell 使用此功能通过特殊类型的文件(匿名管道)对程序进行管道化。但我想知道 Shell 如何以编程方式实现它的详细信息?我不仅对涉及的系统调用感兴趣,而且对整个画面感兴趣。

例如ls | sort,Shell如何对lssort进行I/O重定向?

最佳答案

整个画面很复杂,最好的理解方法是研究一个小shell。对于有限的图片,这里是。在做任何事情之前,shell 会解析整个命令行,因此它确切地知道如何链接进程。假设它遇到 proc1 | proc2.

  • 它建立了一个管道。长话短说,写入 thepipe[0] 最终在 thepipe[1]

    int thepipe[2];
    pipe(thepipe);
  • 它在 exec

    之前 fork 第一个进程并更改其标准输出的方向
    dup2 (thepipe[1], STDOUT_FILENO);
  • 它执行新程序,它很高兴地不知道重定向,只是像一个行为良好的进程一样写入 stdout

  • 它 fork 第二个进程并在 exec

    之前更改其标准输入源
    dup2 (thepipe[0], STDIN_FILENO);
  • 它执行新程序,它不知道它的输入来自另一个程序

就像我说的,这是一张有限的图片。在真实的图片中,shell 将这些菊花链环状连接起来,并记得在适当的时候关闭管端。

关于linux - Shell如何以编程方式实现管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22039319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com