考虑下面的代码:
#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 } }
我的问题是从哪里做代码的subprocess开始执行,即哪一行首先执行? 如果它执行整个代码,它也将创build自己的subprocess,事情将继续发生,这不是肯定发生的!
如果它在fork()命令之后开始,那么if语句是如何进入的呢?
它在fork函数的返回中开始执行子进程。 不在代码的开头。 fork返回父进程中子进程的pid,并在子进程中返回0。
当你执行fork()
,线程被复制到内存中。
所以实际上发生的是你将有两个线程执行你发布的代码片段,但是它们的fork()
返回值是不同的。
对于子线程, fork()
将返回0,所以if
的另一个分支将不会被执行,同样的事情发生在父线程上。
当fork()
被调用时,操作系统为将要产生的新线程分配一个新的地址空间,然后启动它们,它们将共享相同的代码段,但是由于返回值不同,它们将执行不同的部分的代码(如果正确拆分,就像你的例子)
在fork之后,孩子通过执行下一条指令(不是line)来启动。 所以在你的情况下,这是分配的返回值的子变量。
那么,如果我正确地理解了你的问题,我可以告诉你,你的代码将作为一个进程已经运行。当你运行一个代码,它已经是一个过程,所以这个过程如果语句反正。 在fork()之后,你将有另一个进程(子进程)。
在Unix中,一个进程可以创建另一个进程,这就是为什么会发生这种情况。