fork:孩子从哪里开始跑步?

use*_*787 0 c fork

在分叉之后,孩子是从父母的开头还是从父母的地方开始的?

例如,这个程序,是从第1行还是第3行开始的孩子?

int i=1
fork()
i=i*2
fork
i=i*2
Run Code Online (Sandbox Code Playgroud)

Jon*_*fer 7

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个.没有乐趣.)