在分叉之后,孩子是从父母的开头还是从父母的地方开始的?
例如,这个程序,是从第1行还是第3行开始的孩子?
int i=1
fork()
i=i*2
fork
i=i*2
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你错过了exit(0),你会产生2¹⁶-1个进程(在那里,只有100而不是16个.没有乐趣.)