2011-04-07 115 views
14

如果成功,孩子 進程的PID返回父的 線程執行的,並且0 在執行的孩子的線程返回。什麼是叉返回?

p = fork(); 

我在它的手冊頁困惑,是p等於0PID

+0

有人可以在圖片中包含'getpid()'嗎? 'getpid()'在孩子返回0? – Shrinidhi 2011-04-07 08:47:02

+0

@Shrinidhi:'fork()'也是。 – BoltClock 2011-04-07 08:50:51

+1

它既是pid也是0.當fork被調用時,程序「分裂」成兩個 - 它自己和它的邪惡的雙胞胎。在原來的程序中,它是0.在邪惡的雙胞胎計劃中,它是pid。 – 2011-04-07 09:38:09

回答

1

fork()在父進程中被調用。然後產生一個子進程。子進程產生時,fork()已完成執行。

在這一點上,fork()已準備好返回,但它返回一個不同的值,具體取決於它是否在父級或子級。在子進程中,它返回0,並在父進程/線程中返回子進程ID。

+0

你的意思是'fork'在孩子的過程中評估爲'NO Operation'嗎? – compiler 2011-04-07 07:44:45

+0

@compiler:在這種情況下,它有*無副作用*。但是根據調用的位置不同,它會有不同的返回。 – BoltClock 2011-04-07 07:45:37

+0

編號叉子在父項中運行,然後創建一個額外的過程。 fork的返回值在兩個進程之間會有所不同,以便區分二者。 – 2011-04-07 07:45:58

41

我不確定手冊如何更清晰! fork()創建一個新的進程,所以你現在有兩個相同的進程。爲了區分它們,fork()的返回值不同。在原始過程中,您將獲得子進程的PID。在子過程中,你會得到0

因此,一個規範的使用方法如下:

p = fork(); 
if (0 == p) 
{ 
    // We're the child process 
} 
else if (p > 0) 
{ 
    // We're the parent process 
} 
else 
{ 
    // We're the parent process, but child couldn't be created 
} 
+0

'0'也意味着沒有進程被創建,對吧?否則進程會被遞歸創建,永遠不會停止... – compiler 2011-04-07 08:38:15

+2

@compiler:no,這兩個進程(舊的和新創建的)在**之後繼續執行**對'fork'的調用。 – 2011-04-07 09:04:08

+0

@Joachim Sauer,我的意思是沒有進程**創建**,不說**退出** – compiler 2011-04-07 09:54:52

3

這是最酷的部分。 它等於兩者。

呃,不是真的。但是一旦fork返回,您現在有兩個程序正在運行!兩個過程。你可以把它們想象成替代宇宙。其中一個返回值是0。另一方面,這是新工藝的ID

通常你有這樣的事情:

p = fork(); 
if (p == 0){ 
    printf("I am a child process!\n"); 
    //Do child things 
} 
else { 
    printf("I am the parent process! Child is number %d\n", p); 
    //Do parenty things 
} 

在這種情況下,兩個字符串將獲得印刷,但通過不同的工藝!

+1

您有父母/子女倒退。 – interjay 2011-04-07 07:56:12

+0

@interjay:哎呀!謝謝。固定。 – 2011-04-07 07:58:54

+0

同時檢查錯誤(-1 == p)。 – 2016-11-24 20:14:19

8

一旦fork被執行,你有兩個進程。該調用爲每個進程返回不同的值。

如果你做這樣的事情

int f; 
f = fork(); 
if (f == 0) { 
    printf("I am the child\n"); 
} else { 
    printf("I am the parent and the childs pid is %d\n",f); 

} 

你會看到兩個打印的信息。他們正在通過兩個獨立的流程進行打印。這是他們可以區分創建的兩個過程的方式。

+0

當它返回0時,意味着'fork'沒有創建一個進程,對吧? – compiler 2011-04-07 08:01:06

+5

不,這意味着你在孩子的過程中。 「不創建流程」意味着只有一個流程。如果返回「-1」,則意味着沒有創建子項。手冊頁指出了這一點。 – 2011-04-07 08:04:20

+0

什麼時候不創建孩子?如果我在while循環中使用'fork()',我會獲得-1值嗎? – Heisenberg 2013-10-07 14:25:55

28
 
          p = fork(); 
         /* assume no errors */ 
         /* you now have two */ 
         /* programs running */ 
         -------------------- 
     if (p > 0) {    |   if (p == 0) { 
     printf("parent\n");  |    printf("child\n"); 
     ...      |    ... 
6

過程的執行向樹,你只知道你的單親(getppid())的結構。總之,fork()像許多其他系統函數一樣返回-1錯誤,非零值對於fork調用(父級)的發起者知道其新子pid很有用。

沒有什麼作爲例子一樣好:

/* fork/getpid test */ 
#include <sys/types.h> 
#include <unistd.h>  /* fork(), getpid() */ 
#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    int pid; 

    printf("Entry point: my pid is %d, parent pid is %d\n", 
      getpid(), getppid()); 

    pid = fork(); 
    if (pid == 0) { 
     printf("Child: my pid is %d, parent pid is %d\n", 
       getpid(), getppid()); 
    } 
    else if (pid > 0) { 
     printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n", 
       getpid(), getppid(), pid); 
    } 
    else { 
     printf("Parent: oops! can not create a child (my pid is %d)\n", 
       getpid()); 
    } 

    return 0; 
} 

而結果(是bash PID 2249,在這種情況下):

Entry point: my pid is 16051, parent pid is 2249 
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052 
Child: my pid is 16052, parent pid is 16051 

如果你需要共享一些資源(文件,父pid等),看看clone()(對於GNU C庫,也可能是其他的)

0

Fork創建一個重複的進程和一個新的進程上下文。當它返回一個0值時,這意味着一個子進程正在運行,但是當它返回另一個值,這意味着一個父進程正在運行。我們通常使用wait語句,以便子進程完成並且父進程開始執行。

0

我認爲它的工作原理是這樣的: 當pid = fork()時,代碼應該執行兩次,一個在當前進程中,一個在子進程中。 所以它解釋了爲什麼if/else都執行。 順序是,第一個當前進程,然後執行子進程。

+0

訂單不保證(據我所知)。 – 2016-11-24 20:12:30