我不明白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)
我不明白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)
一個是做邏輯測試,另一個是做一個按位和結果。
fork() && fork()
這將分叉。在父項中,它將再次分叉,因爲第一個分支的計算結果爲非零值(pid),而在子項中則不會。
fork() & fork()
父和子都會分叉,因爲這會執行按位分隔以及分叉的返回值(PID或零)。
在fork() && fork()
第一叉返回0。這意味着假等等&&
子句的其餘部分的評價被放棄(這將是假無論該條的其餘部分的值的)
的&
版本始終計算(執行)雙方
它像
if (x != null && x->foo == 42)
printf("42");
第二部分(富== 42)如果第一部分(X!= NULL)是假的沒有被觸及
這是由於&&
運營商的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()
。如果你使用的工具,你不明白這樣的問題會回來經常困擾你。
我會解決這個問題的方法是首先通過查找關於C操作符的資源來學習'&'和'&&'之間的區別。然後,我將通過閱讀POSIX規範或Linux man手冊來了解'fork'的功能。 –