孩子在fork之后是从头开始还是从父的地方开始?
比如这个程序,孩子是从第1行还是第3行开始?
int i=1
fork()
i=i*2
fork
i=i*2
fork() 通过复制调用进程来创建一个新进程。新进程(称为子进程)与调用进程(称为父进程)完全相同,但以下几点除外:[…]
从fork(2)
由于它是完全重复的,因此它也将具有相同的指令指针和堆栈。所以孩子会在打电话后马上到fork()
。现在,您可能会问,我如何确定当前程序是孩子还是父母?有关返回值,请参见手册页:
成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并适当设置 errno。
因此,如果 的结果fork()
等于0
,则您在子进程中,如果它大于0
您在父进程中,如果它低于0
您有麻烦。
请注意,这意味着与 的结果值无关的每个代码都将fork()
在子级和父级中执行。因此,例如,如果您要创建一个包含 16 个进程的池,您应该这样做:
for (int i = 0; i < 16; i++) {
pid_t pid = fork()
if (pid == 0) {
do_some_work();
exit(0);
} else if (pid < 0) {
// fork failed
do_some_error_handling();
}
}
如果你错过了exit(0)
,你会产生 2¹⁶-1 进程(去过那里,只有 100 个而不是 16 个。没有乐趣。)
将Child
在第 2 行即创建,fork()
但它将从第 3 行即开始执行i = i*2
。让我感到困惑的是你的第 4 行。你想在那里做什么?
分叉从第 3 行开始,即分叉发生的点。
当 fork 返回时,它同时返回父级(返回子级的 PID)和子级(返回 0)。执行从那里继续在父母和孩子。
因此,fork 的典型用法如下:
if (0 == (child = fork()))
// continue as child.
else
// Continue as parent.