【问题标题】:Pipe and fork in unix |?unix中的管道和叉子|?
【发布时间】:2018-06-26 13:31:52
【问题描述】:

我正在阅读what's a pipe in an operating system,但有些东西我不明白。

采用一系列 unix 管道字符分隔的命令,例如

cat file | grep "something"

处理管道| 时会发生什么?我知道通过 pipe() 函数打开了一个 unix 管道,但我看不到在所涉及的任何进程中如何在这里发生“分叉”。

会发生什么以及如何涉及分叉(如果有的话)?

【问题讨论】:

  • 如果对fork 感到困惑,请不要将问题与管道混淆。当您在交互式 shell 中键入 cat file 时,就会发生分叉。您需要先了解这一点。

标签: unix pipe fork


【解决方案1】:

对于您的情况,实际上有 两个 fork 调用:一个用于cat 命令,一个用于grep 命令。

fork 调用是必需的,因为在 POSIX 中执行程序的唯一标准方法是使用 exec 系列调用,并且这些调用替换当前进程映像与来自加载的程序。如果 shell 没有为它执行的每个命令 fork 一个新进程,那么第一个运行的程序将替换 shell,并且 shell 将不再存在。

管道的设置使得管道的写端将连接到第一个子进程的标准输出(cat 命令),而管道的读端将连接到标准输入第二个子进程(grep 命令)。

所有这些都发生在 shell 的幕后。

【讨论】:

  • 谢谢,我仔细阅读并认为我知道 unix 没有 CreateProcess 等价物,但范式是 fork() 和(也许)exec()。因此forks 系列。
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2018-05-26
  • 2017-07-07
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多