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

时间:2012-07-02 05:35:58

标签: c fork

在分叉之后,孩子是从父母开始或从父母的地方开始程序吗?

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

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

4 个答案:

答案 0 :(得分:6)

  

fork()通过复制调用进程来创建一个新进程。   这个被称为孩子的新过程完全相同   调用进程,称为父进程,除了   以下几点:[...]

来自fork(2)

由于它是完全相同的,它也将具有相同的指令指针和堆栈。因此,孩子将在致电fork()之后立即行动。现在,您可能会问,我如何确定当前的计划是孩子还是父母?请参阅返回值的联机帮助页:

  

成功时,子进程的PID在父进程中返回,   在孩子身上返回0。失败时,返回-1   parent,没有创建子进程,并且正确设置了errno。

因此,如果fork()的结果等于0,那么您就在子进程中,如果它大于0您在父级中,并且在其下方{ {1}}你遇到了麻烦。

请注意,这意味着每个与0的结果值无关的代码都将在两个子项和父项中执行。因此,如果您要创建一个包含16个进程的池,您应该这样做:

fork()

如果你错过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(); } } ,你会产生2¹⁶-1个进程(在那里,只有100而不是16个。没有乐趣。)

答案 1 :(得分:0)

fork从第3行开始,即fork出现的位置。

答案 2 :(得分:0)

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

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

if (0 == (child = fork()))
    // continue as child.
else
    // Continue as parent.

答案 3 :(得分:0)

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