這就是所謂的邏輯與操作。這將評估兩個操作數的邏輯與操作結果。該運算符的屬性如下:
首先評估左側操作數,如果它爲TRUE(非零),則評估右側操作數。如果它也是真的,那麼整個表達式就是真的,否則就是假。另一方面,如果左邊的操作數是FALSE,那麼右邊的操作數是根本沒有評估。這可以這樣做,因爲一個操作數是假的,無論是另一個操作數,表達式都會變成假。這被稱爲short circuiting
在你的代碼,如果左手,如果ret
是真實的,那麼只有右側部分進行評估,最終調用fork()
系統調用。呼叫的返回值與當前值ret
進行與運算,並重新分配到ret
。
基本上它的工作原理是
if (ret == TRUE)
{
retval = fork();
ret = ret && retval;
}
閱讀:
成功時,子進程的PID在父回來,在孩子則返回0。失敗時,在父項中返回-1,不創建子進程,並且適當地設置errno。
考慮下面的分叉樹。每個樹「節點」顯示每個單獨語句中已執行語句的順序。一行一行。
(p1)
+--+ret = fork();
| printf 1 shows pid
| && allows fork(), ret = 1 = pid1 && pid2
| printf 2 shows 1 +
| `if' not entered |
| show hello |
| | (p3)
| +--+ ret = 0 = ret && fork() (this is 0 here)
+-----+ printf 2 shows 0
| `if' is entered
| fork()
| show hello
| +
| |
+ |
(p2) |
level 1 +-------+
print 0 in 1st printf |
&& DOES NOT allow fork() (p5)
print 0 in 2st printf show hello
`if' entered
fork() +-----------+
show hello |
|
+
(p4)
show hello
這裏在每個過程中發生了什麼。
P1 執行fork()
一次,並且在RET一個PID(非零)。打印pid 短路允許執行fork()。由於這是父項,它將返回另一個pid,該id與之前的子項pid匹配,評估值爲1.因此,ret
現在包含1,該值將打印在第二個printf中。因爲ret
爲1,因此if
未執行。你好打印。
p2 p1的孩子,所以ret有0.在第一個printf中打印0。短路不允許fork()
呼叫。 if
正文被輸入,並調用fork()
,這使得(p4)。現在(p2)繼續打印Hello。
P3 兒童P1,所以fork()
收益爲0,這是相與RET,並使其0分配之後。這是第一次printf後產生的,所以只有第二次printf顯示0. if
被輸入,fork()
被執行,這使得(p5)。現在p4繼續打印Hello。
P4從if
體 開始,失控和打印Hello
P5從if
體 開始,失控和印刷品你好
上面我試圖表達的過程中產卵樹,並且每個進程中的工作順序在樹上的進程「節點」的每一行中表示。邊緣表示產卵,邊緣從相應的叉子開始。
它是一個布爾操作符... http://en.wikipedia.org/wiki/Boolean_algebra#Basic_operations另外,它非常有趣,爲什麼最後有一個'return 1'。這是無稽之談。 – Gandaro 2012-02-15 18:49:28
你需要的是一個涵蓋了C的基本知識的教程。 – dandan78 2012-02-15 18:49:33
草率代碼確實令人困惑 – 2012-02-15 18:57:03