0

Fork() 进程最终会在内核内部调用 do_fork() ,从而制作其自身的精确副本。当我阅读书籍时,它说 fork 的孩子将调用 exec 来创建新进程。

例子:

shell 上的 ls 命令,将创建这种方式。

   sh(Parent)
       |
   sh(Child)
       |
   ls(New Process)

但是,我无法理解 exec*() 的调用方式和位置?因为,我所看到的只是 shell(child) 是在 fork 中创建的。但是,新流程将在何时何地创建/执行?

4

1 回答 1

2

如果您确实exec()想要在其中一个进程中运行一个新程序(通常是子进程,但不是绝对必要的),则必须这样做。在您执行外壳程序的特定情况下,ls外壳程序首先分叉,然后子进程执行。但重要的是要意识到这是两个不同的操作。

所做的只是给你fork()两个(几乎)相同的进程,然后你可以使用返回码fork()来决定你是父母(你得到孩子的正PID,或者如果fork()失败则为-1)或孩子(你得到0)。

有关如何协同工作(在您的控制下)以及如何在没有彼此的情况下使用它们的描述,请参阅此答案。fork()exec()

与此类似do_fork(),这些exec东西都归结为调用do_execve,位于exec.c.

于 2013-05-21T02:43:35.007 回答