簡體   English   中英

什么時候 fork() == fork()?

[英]When does fork() == fork()?

我在網上讀到,在下面的代碼中,一個子進程將創建另一個子進程,並且Hello將被打印一次。

if (fork()==fork())
    printf("Hello\n");

因此,父親 (0) 將創建 2 個子進程 (1)、(2),而子 (1) 將創建另一個子進程 (3)。 所以只有孩子 1 有一個孩子,在 output 中Hello確實會打印一次,盡管總共會有 4 個進程。

但是接下來的代碼呢:

int i;
for (i=0; i<2; i++)
    if (fork()==fork())
        printf("Hello\n");

我知道總共有 16 個正在運行的進程。 如果我使用與以前相同的方法計算,則有 7 個子進程,每個子進程都有一個子進程,但 output 將只有 5 次“Hello”。 誰能解釋一下?

所以你已經確定這段代碼:

if (fork()==fork())
    printf("Hello\n");

將 1 個進程拆分為 4 個,其中一個打印“Hello”。

如果我們這樣做兩次:

if (fork()==fork())
    printf("Hello\n");

if (fork()==fork())
    printf("Hello\n");

然后前 1 個進程分成 4 個,其中一個打印“Hello”。 然后這 4 個進程中的每一個都拆分為 4 個(因此總共有 16 個),每個拆分中的 1 個打印“Hello”。 總共 5 個“你好”。 到目前為止你明白了嗎?

現在,把它放在一個循環中沒有區別:

int i;
for (i=0; i<2; i++)
    if (fork()==fork())
        printf("Hello\n");

完全一樣

if (fork()==fork())
    printf("Hello\n");

if (fork()==fork())
    printf("Hello\n");

Label 16 個進程A_P_ 不失一般性,假設等式運算符的左側先於右側求值。

這16個過程和循環迭代可以總結為下表:

PID     PPID    i       Left    Right   L==R
----    ----    -       ----    -----   ----

A_      n/a     0       B_      C_      0
A_      n/a     1       D_      E_      0

B_      A_      0       0       F_      0
B_      A_      1       G_      H_      0

C_      A_      0       B_      0       0
C_      A_      1       I_      J_      0

D_      A_      1       0       K_      0

E_      A_      1       D_      0       0

F_      B_      0       0       0       1
F_      B_      1       L_      M_      0

G_      B_      1       0       N_      0

H_      B_      1       G_      0       0

I_      C_      1       0       O_      0

J_      C_      1       I_      0       0

K_      D_      1       0       0       1

L_      F_      1       0       P_      0

M_      F_      1       L_      0       0

N_      G_      1       0       0       1

O_      I_      1       0       0       1

P_      F_      1       0       0       1

可以看出,當雙方都等於來自fork()的返回值 0 時,恰好有 5 個進程的等式評估為 1。

由於進程號在進程死亡后被回收,某些進程可能最終以相同的進程號結束的可能性非常小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM