考虑代码:
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
/* main --- do the work */
int main(int argc, char **argv)
{
pid_t child;
if ((child = fork()) < 0) {
fprintf(stderr, "%s: fork of child failed: %s\n",
argv[0], strerror(errno));
exit(1);
} else if (child == 0) {
// do something in child
}
} else {
// do something in parent
}
}
我的问题是子进程开始执行的代码在哪里,即首先执行哪一行? 如果它执行整个代码,它也会创建自己的子进程,并且事情将继续发生,这肯定不会发生!!!
如果它在fork()命令之后启动,它是如何在if语句中进行的?
答案 0 :(得分:7)
它在fork函数的返回中开始执行子进程。不在代码的开头。 fork在父进程中返回子进程的pid,并在子进程中返回0。
答案 1 :(得分:6)
执行fork()
时,线程会复制到内存中。
所以有效的情况是你将有两个线程来执行你发布的代码片段,但它们的fork()
返回值会有所不同。
对于子线程fork()
将返回0,因此if
的另一个分支将不会被执行,父线程也会发生同样的事情。
当调用fork()
时,操作系统会为将要生成的新线程分配一个新的地址空间,然后启动它,它们将共享相同的代码段,但由于返回值不同它们将执行代码的不同部分(如果正确分割,如在您的示例中)
答案 2 :(得分:2)
子进程在fork之后执行下一条指令(不是行)。因此,在您的情况下,它是将fork的返回值赋给子变量。
答案 3 :(得分:0)
好吧,如果我理解你的问题,我可以告诉你,你的代码已经作为一个进程运行了。当你运行一个代码时,它已经是一个进程了,所以无论如何这个进程都是if语句。在fork()之后,你将有另一个进程(子进程)。
在Unix中,进程可以创建另一个进程,这就是发生这种情况的原因。
答案 4 :(得分:0)
子进程中的代码执行从 fork()
系统调用之后的下一条指令开始。
fork()
系统调用只是为子进程创建一个单独的地址空间,因此它是父进程的克隆副本,子进程拥有其父进程的所有内存元素 .
因此,在通过 fork() 生成子进程后,两个进程(父进程和子进程)从 fork()
系统调用之后的下一条指令恢复执行< /strong>。