0

孩子在fork之后是从头开始还是从父的地方开始?

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

int i=1
fork()
i=i*2
fork
i=i*2
4

4 回答 4

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();
    }
}

如果你错过了exit(0),你会产生 2¹⁶-1 进程(去过那里,只有 100 个而不是 16 个。没有乐趣。)

于 2012-07-02T05:39:48.647 回答
0

Child在第 2 行即创建,fork()但它将从第 3 行即开始执行i = i*2。让我感到困惑的是你的第 4 行。你想在那里做什么?

于 2012-07-02T05:46:25.783 回答
0

分叉从第 3 行开始,即分叉发生的点。

于 2012-07-02T05:37:18.750 回答
0

当 fork 返回时,它同时返回父级(返回子级的 PID)和子级(返回 0)。执行从那里继续在父母和孩子。

因此,fork 的典型用法如下:

if (0 == (child = fork()))
    // continue as child.
else
    // Continue as parent.
于 2012-07-02T05:40:53.217 回答