经过叉子和叉子儿子援引Execv之后,结果仍然是父子的儿子吗?

有帮助吗?

解决方案

叉创建一个名为父母的新过程.....执行exec将当前运行程序替换为exec'd,因此仍然是父级的子进程...

其他提示

是的。 Execv不会创建新的过程 - 这就是为什么您需要先分叉。

是的。同样,术语“过程家族”也非常接近“过程组”,这是一个非常重要的概念。

您在正确的轨道上。基本上, 叉(2) 系统调用旧的Unix创建了一个过程的副本,该过程带有新的PID和一个新的过程堆栈,从而复制了内存空间以执行此操作。这 执行 用新图像加载现有过程。您可以在 exec 在大多数外壳中操作 - 它在壳占据的过程中取消了所需的图像。

当您分叉一个过程时,如果您是父母,则叉系统调用返回了新过程的PID,或者如果您是孩子,则返回了0。子进程还继承了所有打开的文件描述符,特别是0,1和2,通常称为stdin,stdout和stderr。

(流行测验:您如何假设外壳管理重定向,例如 >?)

具有较大地址空间的更现代的Unix变体(原始Unix总共只有64k单词!) vfork 这仅复制了开始运行的过程的必要子集,并取决于内存管理器在需要时拉动其余部分。由于大多数时候要立即进行EXEC,因此需要加载新图像,因此这是一个重要的优化。

马赫迈出了进一步的一步。当您创建新的Pprocess时,除了您需要执行上下文所需的内容外,什么也没有复制。图像完全相同。仅当过程更改内存中的位置时,复制才会发生,此时包含该位置的页面已复制。这称为“写作”,几乎是最佳的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top