2012-04-16 46 views
3

考虑代码:代码在哪里执行在子进程中启动?

#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 
    } 
} 

我的问题是从那里在子进程开始执行代码的作用,首先执行哪即线?? 如果它执行整个代码,它也会创建它自己的子进程,并且事情会持续发生,这并不是肯定会发生的!

如果叉()命令后开始,它是如何进去if语句在第一?

+0

”哪一次不会发生!!!“所以为了清楚你已经运行了这个,它只分了一次? – 2012-04-16 16:03:50

+3

好的:fork()调用返回**两次**:一次为父,一次为子。目前,父母和孩子在分叉的返回值上只有不同。 – wildplasser 2012-04-16 16:04:27

回答

6

当你执行一个fork()线程被复制到内存中。

所以真正发生的事是,你将有两个线程执行您发布的片断,但他们的fork()返回值会有所不同。

对于子线程fork()将返回0,所以if的另一个分支将不会执行,同样的事情发生在父线程。

当调用fork()时,操作系统为将要产生的新线程分配一个新的地址空间,然后启动它,它们将共享相同的代码段,但由于返回值会不同,它们将执行该代码的不同部分(如果正确地在你的榜样拆分,等等)

7

它开始孩子在fork函数返回的执行。不在代码的开头。 fork返回父进程中子进程的PID,并在子进程中返回0。

2

孩子在fork之后执行下一条指令(不是line)。所以在你的情况下,这是fork的返回值赋值给子变量。

0

好吧,如果我正确理解你的问题,我可以告诉你,你already.When运行代码,您的代码将作为一个进程中运行,它已经是一个过程,所以这个过程转到if语句反正。在fork()之后,你将有另一个进程(子进程)。

在Unix中,一个进程可以创建另一个进程,这就是为什么发生这种情况。 “

相关问题