[英]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.