[英]Explanation of a output of a C program involving fork()
運行這個程序正在打印“分叉!” 7次。 有人可以解釋一下“分叉!” 正在打印7次?
#include<stdio.h>
#include<unistd.h>
int main(){
fork() && fork() || fork() && fork();
printf("forked!\n");
return 0;
}
這里使用了幾個概念,第一個是知道fork
在什么情況下做什么以及它返回什么。 很快,當它被調用時,它會創建一個重復的調用者進程,並在子進程中返回0
(邏輯表達式為false
),父進程返回非零(邏輯表達式為true
)。 實際上,它可以在出現錯誤時返回負(非零)值,但在這里我們假設它總是成功。
第二個概念是邏輯表達式的短路計算,例如&&
和||
,具體來說, 0 && fork()
不會調用fork()
,因為如果第一個操作數為false
(零),則不需要計算第二個操作數。 同樣, 1 || fork()
1 || fork()
也不會調用fork()
。
另請注意,在子進程中,表達式的計算將繼續與父進程中的計算相同。
另請注意,由於優先級,表達式按以下順序計算:
(fork() && fork()) || (fork() && fork())
這些觀察結果應該引導您找到正確的答案。
考慮fork() && fork()
的簡化示例
fork()
/ \
false true && fork()
/ \
false true
所以這里創建了三個進程,其中兩個返回false
作為結果,一個返回true
。 然后為||
我們讓所有進程返回false
嘗試再次運行相同的語句,所以我們有2 * 3 + 1 = 7
作為答案。
與我在評論中提到的不同,這不是關於緩沖。 過程分叉。 父進程執行第二個分叉,而子進程短路第二個分支並執行第三個分支。 第一個孫子評估第一個&&
為false並執行第3個fork。 這產生了2個進程,其中一個進程評估第4個分支。 與此同時(或之前或之后......存在競爭條件!),另一個孩子在評估||
的RHS時已成為3個過程 。 總之,7個進程最終運行。 畫一棵樹。
要簡化計算,請考慮:
int f( void )
{
int k;
k = fork();
printf( "%d\n", (int) getpid());
fflush( stdout );
return k;
}
int main( void ) { f() && f() || f() && f(); return 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.