关于执行和处理家庭关系的问题

时间:2010-08-20 02:04:36

标签: linux fork execv

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

是。 execv不会创建一个新进程 - 这就是你需要先fork的原因。

答案 2 :(得分:2)

是的。此外,术语“过程族”令人不安地接近“过程组”,这是一个非常重要的概念。

答案 3 :(得分:0)

你走在正确的轨道上。基本上,旧的UNIX中的 fork(2)系统调用创建了一个分叉的进程的副本,使用新的PID和一个新的进程堆栈,复制内存空间来执行此操作。 exec 使用新图像加载现有流程。您可以在大多数shell中的exec操作中看到它的一个版本 - 它不是shell占用的进程中所需的图像。

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

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

更多具有更大地址空间的现代UNIX变体(原始UNIX总共只有64K字!)实现了一个名为 vfork 的变量分叉,它只复制过程的必要子集以开始运行,并依赖于如果需要,内存管理器可以完成剩下的工作。由于大多数时候fork都紧跟exec,无论如何都需要加载新图像,这是一个重要的优化。

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