2012-04-16 45 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中,一個進程可以創建另一個進程,這就是爲什麼發生這種情況。 「

相關問題