【问题标题】:What Does the Process Tree Look Like Using Fork()?使用 Fork() 的进程树是什么样的?
【发布时间】:2013-03-04 05:47:22
【问题描述】:

例如,我们在 shell 中执行了以下操作:

ls | grep "abc" | wc

我了解子进程如何从 shell 派生以及它的子进程如何,像这样,

Shell (pid=12)
       \
        \
         ls (pid=13)

但我不确定管道和尾随命令如何适应。它们也是 shell 的子级,而不是 ls

【问题讨论】:

  • 您熟悉pstree 实用程序吗?
  • 对于 OP:从 this code 了解 shell 如何实际实现 | 运算符。在代码中搜索这一行:if (!(newJob.progs[i].pid = fork())) 然后你就知道 ls, grep, wc 是 shell 的子进程...代码不是 bash 代码,但 Bash 做类似..

标签: c fork conceptual


【解决方案1】:

管道的每个组件都将是 shell 的一个子进程。如果您从另一个终端使用pstree -p,您可能会看到如下内容:

...
sshd(11)---bash(12)-+-ls(13)
                    |-grep(14)
                    \-wc(15)
...

(假设您可以在管道仍在运行时运行它!)

但是,请注意,所有组件都将形成一个 process group

管道本身是 Linux(或您使用的任何操作系统)的一项功能,它不是一个单独的用户进程。 shell 创建一些anonymous pipes,并将它们与管道中每对进程的相关文件描述符挂钩。

【讨论】:

  • 谢谢你们的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
相关资源
最近更新 更多