在一个进程分叉和分叉的儿子调用execv后,结果仍然是父亲的儿子?
答案 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时,除了执行上下文所需的内容之外,不会复制任何内容。图像完全一样。仅当进程更改内存中的位置时才会进行复制,此时将复制包含该位置的页面。这称为“写入时复制”,几乎是最佳的。