在分叉之后,孩子是从父母开始或从父母的地方开始程序吗?
例如,这个程序是从第1行还是第3行开始的孩子?
int i=1
fork()
i=i*2
fork
i=i*2
答案 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行。你想在那里做什么?