【发布时间】:2014-09-16 18:53:36
【问题描述】:
我知道“为什么会这样”的答案是因为语言是这样发明的,但是 fork() 生成调用它的过程的副本似乎是浪费了很多精力。也许有时它很有用,但大多数时候肯定有人想开始一个新进程,而不是与调用进程重复吗?为什么 fork 创建一个相同的进程,而不是一个空的或通过传递参数定义的?
来自yolinux
fork() 系统调用将产生一个新的子进程,它是 与父进程相同的进程,但具有新的系统进程 身份证
换句话说,什么时候从父进程的副本开始有用?
【问题讨论】:
-
一个显而易见的答案:Apache 网络服务器。一个父级“控制” apache 的实例派生了许多子级,这些子级是实际处理 http 请求的那些子级。为父进程支付一次启动成本并搭载子进程的成本要低得多
-
如果不是父进程的副本,新进程会运行什么代码?
-
@MarkRansom:一些系统支持“spawn”调用,它要求操作系统内核创建一个具有指定可执行文件的新进程。例如,这就是 Windows 上的 CreateProcess 所做的。
-
@nneonneo 跟上 POSIX 语义,我们应该参考各种
exec()变体,它们将取代实际进程的代码空间(而不是像system()这样的调用那样启动新进程做)。 -
@MarkRansom OTOH,通常在分叉后直接调用
exec。