簡體   English   中英

涉及fork()的C程序輸出的說明

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

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