2013-02-16 83 views
-1

我很好地理解了unix进程创建中的父子关系。但我不明白其背后的理由:(为什么我们需要从当前进程分叉创建一个新的,然后用新代码覆盖它的形象,如果有的话?欢呼Unix亲子进程关系

+0

因为这是你想要的许多情况下(线程),并且因为它非常快。你可以产生像没有明天一样的流程,你只需要为你实际需要做的事情付出代价。 – us2012 2013-02-16 13:07:03

+0

这背后的基本原理是* COW *(写入时拷贝)便宜:仅内核**必须克隆页表(并设置标志以指示COW)。如果这是fork()之后的exec(),这有点太过分了,但是如果没有exec(),那么在需要时,子页面将会出错。 (历史旁注:当设计fork()机制时,具有COW特性的MMU尚未发明) – wildplasser 2013-02-16 13:22:57

+0

'fork'在COW之前存在....最初的PDP-8 Unix没有COW;那时'fork'复制了整个64Kbyte的地址空间...... – 2013-02-16 13:24:52

回答

1

理由是,unix system calls (至少最初)的“基本”操作由内核来完成。

在实践中,应用程序经常做一些具体的事情fork(2)execve(2)之间,特别是呼叫close(2)dup2(2),也sigaction(2)忽略一些信号(有可能一些pipe(2)系统调用在fork之前完成)。

如果您希望一次只处理一个系统调用,那将会非常复杂,而且不够灵活。

我建议阅读Advanced Linux Programming(免费和在线)或Advanced Unix Programming以及intro(2)之类的书。

我发现相反,意图分开创建一个过程和执行一个程序很自然。我不明白你为什么要把两种操作结合​​起来。

另请参见this我的关于系统调用的答案。