2017-02-10 102 views
1

我不明白fork() & fork()fork() && fork()之間有什麼區別。我也爲他們獲得不同的輸出。關於fork()系統調用中的混淆C

fork() & fork(); 
printf("hi\n"); 

Output : hi 
hi 
hi 
hi 

fork() && fork(); 
printf("hi\n"); 

Output: hi 
hi 
hi 

誰能請解釋一下什麼怎麼回事。這是編譯器的問題嗎? (我在ubuntu14上使用gcc)

+0

我會解決這個問題的方法是首先通過查找關於C操作符的資源來學習'&'和'&&'之間的區別。然後,我將通過閱讀POSIX規範或Linux man手冊來了解'fork'的功能。 –

回答

3

一個是做邏輯測試,另一個是做一個按位和結果。

fork() && fork() 

這將分叉。在父項中,它將再次分叉,因爲第一個分支的計算結果爲非零值(pid),而在子項中則不會。

fork() & fork() 

父和子都會分叉,因爲這會執行按位分隔以及分叉的返回值(PID或零)。

1

fork() && fork()第一叉返回0。這意味着假等等&&子句的其餘部分的評價被放棄(這將是假無論該條的其餘部分的值的)

&版本始終計算(執行)雙方

它像

if (x != null && x->foo == 42) 
    printf("42"); 

第二部分(富== 42)如果第一部分(X!= NULL)是假的沒有被觸及

0

這是由於&&運營商的short-circuit evaluation屬性。基本上,對於任何表達x && y,x首先被評估。如果結果爲false,y根本沒有評估,並且整個表達式評估爲false。否則,結果是評估y,如果需要,將其轉換爲布爾值。因此,例如,false && printf("Is this evaluated?\n")將不會打印任何內容。

這意味着fork() && fork()將首先評估第一個fork(),並且當且僅當第一個結果爲非零結果時評估第二個。在fork()函數的特定情況下,這隻發生在父進程中,因爲子進程獲得0返回狀態。因此,原始父母分叉兩次,但孩子不分。結果是隻會產生三個進程。

另一方面,&算子沒有短路評估,因爲它不是邏輯與,而是按位與。由於&不是關於布爾值,而是關於位(與&&不同),所以始終評估兩個參數。這意味着在fork() & fork()的情況下,父母將分叉兩次,並且第一個孩子將再次分叉,導致四個不同的過程。

順便說一句,你應該學習C語言,而不是直接跳到fork()。如果你使用的工具,你不明白這樣的問題會回來經常困擾你。