1

在一个进程分叉并且分叉的儿子调用 execv 之后,结果仍然是父亲的儿子吗?

4

4 回答 4

4

fork 创建了一个新进程,称为父进程的 CHILD .....exec 用进程 exec'd 替换当前正在运行的程序,因此仍然是父进程的 CHILD ...

于 2010-08-20T02:08:37.787 回答
3

是的。execv 不会创建新进程 - 这就是您需要先分叉的原因。

于 2010-08-20T02:07:31.393 回答
2

是的。此外,术语“进程族”与“进程组”非常接近,这是一个非常重要的概念。

于 2010-08-20T02:07:00.740 回答
0

你在正确的轨道上。基本上,旧 UNIX 中的fork(2)系统调用创建了一个 fork 进程的副本,带有一个新的 PID 和一个新的进程堆栈,复制内存空间来完成它。exec使用新图像加载现有进程。您可以在大多数 shell 的操作中看到其中的一个版本exec——它在 shell 占用的进程中取消了所需的映像。

当你 fork 一个进程时,fork 系统调用返回新进程的 PID,如果你是父进程,或者 0 如果你是子进程。子进程还继承所有打开的文件描述符,特别是 0、1 和 2,通常称为 STDIN、STDOUT 和 STDERR。

(小测验:你认为 shell 如何管理重定向,例如使用>?)

具有更大地址空间的更现代的 UNIX 变体(最初的 UNIX 总共只有 64K 字!)实现了一个称为vfork的变体 fork ,它只复制进程的必要子集以开始运行,并依赖内存管理器在需要时拉入其余部分. 由于大多数情况下 fork 之后紧跟 exec,无论如何它都需要加载新图像,因此这是一个重要的优化。

马赫更进一步。当您创建一个新的 pprocess 时,除了执行上下文所需的内容外,不会复制任何内容;图像完全相同。复制仅在进程更改内存中的位置时发生,此时包含该位置的页面被复制。这称为“写时复制”,几乎是最佳的。

于 2010-08-20T02:25:47.047 回答