【发布时间】:2012-01-07 16:45:15
【问题描述】:
所以,我使用了fork(),我知道它的作用。作为一个初学者,我很害怕它(我仍然不完全理解它)。你可以在网上找到fork()的一般描述是,它复制当前进程并分配不同的PID,父PID并且进程将具有不同的地址空间。一切都很好,但是,鉴于此功能描述,初学者会想知道“为什么这个功能如此重要......为什么我要复制我的流程?”。所以我确实想知道,最终我发现这就是您可以通过execve() 系列从当前进程中调用其他进程的方式。
我仍然不明白为什么你必须这样做?最合乎逻辑的事情是拥有一个可以像
一样调用的函数create_process("executable_path+name",params..., more params);
这将产生一个新进程并在 main() 的开头开始运行它并返回新的 PID。
让我感到困扰的是 fork/execve 解决方案正在做可能不需要的工作。如果我的进程正在使用大量内存怎么办?内核是否复制我的页表等。我确信它并没有真正分配真正的内存,除非我接触过它。另外,如果我有线程会发生什么?在我看来,它太乱了。
几乎所有关于 fork 的描述,说它只是复制进程,新进程在fork() 调用之后开始运行。这确实是发生的事情,但为什么会这样,为什么 fork/execve 是生成新进程的唯一方法,从当前进程创建新进程的最通用的 unix 方法是什么?还有其他更有效的方法来生成进程吗?** 不需要复制更多内存。
This 讨论了同样的问题,但我觉得不太满意:
谢谢。
【问题讨论】:
-
为什么选择unix?这是一个属于堆栈溢出的编程问题。
-
在阅读了 vfork 的手册页之后,我认为你是对的。 fork 确实有一些不需要的行为。所以,vfork 在一般情况下更好,只是在非常 spci 的情况下,需要 fork,例如,孩子确实需要父母的一些内存结构。并且不要执行任何其他 ELF 文件。
-
链接已失效,但我怀疑landley.net/history/mirror/unix/dmr/hist.html 是同一个文档。