2012-07-10 88 views
4

功能我只需要了解這個說法:fork()的C編程

if (fork() && !fork()) 

應該不是永遠是假的呢?我的意思是,如果我寫:

if (a && !a) 

它總是假的,因此首先應該永遠是假的太多,我錯了?我當然是,但我希望有人能向我解釋這個奇怪的事情。

我學習下一個考試,我必須解決這個代碼:因爲它不是一個變量

int main(){ 
if(fork && !fork()){ 
    printf("a\n"); 
} 
else printf("b\n"); 
} 
+0

如果您編輯您的問題,並格式化你到代碼段什麼樣的代碼這將是很好 – mathematician1975 2012-07-10 20:00:12

+1

只有'fork'返回相同的值的兩倍......(有些情況下是很好的,但要注意,返回值是不同的在創建的2個過程中)。 – geoffspear 2012-07-10 20:00:28

回答

8

每次調用到UNIX進程創建系統調用fork()的返回兩次。首先,它返回父進程的子進程(調用fork()的進程)。其次它返回到0新創建的孩子。

從手冊頁:

返回值

成功時,子進程的PID返回父,並在孩子則返回0。失敗時,在父項中返回-1,不創建子進程,並且適當地設置errno。

你的情況

if (fork() && !fork()) 

的語句中if,叉調用兩次。所以會發生什麼是以下幾點:

A 
|----------------B 
|    | 
|---C   | 
| |   |   

現在先請fork()將在A和B都返回一個將是非零和B中也將是零。

到叉二()調用將僅由A.因爲第一叉返回0至B,它不會喚起一個第二fork()誘發。 其原因是&&如果發現第一個操作數非零,則評估會短路。感謝Daniel指出了這一點。

因此,我們可以做一個表出來的這個:

PID  fork()1  fork()2 
------------------------------ 
A   >0   >0 
B   =0   >0 
C   >0   =0 
從圖表

因此,處理C的if將進行評估,以TRUE

其重要要記住,沒有返回fork()1到C.它得到副本已從其父母評估表達式

我希望這能解釋你的問題。

+1

[我說這之前(http://stackoverflow.com/questions/11420932/fork-function-in-c-programming#comment15064848_11421071):只會有三個過程,第一個孩子不'叉()因爲'&&'捷徑。 – 2012-07-10 20:50:40

+0

感謝您的評論。我忽略了它。我在編輯我的答案以反映它。 – Aftnix 2012-07-10 20:53:02

+0

好。一旦你修好了,這是一個很好的解釋。 – 2012-07-10 20:58:14

3
shouldn't be always false? 

,每次調用fork()創建一個新的子處理。

+0

那麼if(fork()&&!fork())的含義是什麼? – gyosko 2012-07-10 20:03:03

+0

它在子代中返回0,在其父代中返回pid(不是0)。 – fork0 2012-07-10 20:03:34

+0

在父母的第二個孩子身上做些事情。你真的更好地發佈整個代碼。 – fork0 2012-07-10 20:04:05

1

fork()每次調用返回兩個值,一個用於各處理。因此,對於每個決策,都有一個過程採用每條路徑。

6

首先,是一個函數。它可能並不總是返回相同的值。

在這種情況下具體地,叉是創建另一個進程的功能。原來的工藝獲得了正收益值(孩子的PID)和子進程獲得0

返回值在你的代碼中,最終成爲一共有三個過程。 if語句將對其中的1個進行評估(下面的流程C)。

 A 
    |__________B 
    |   | 
    |__C  | 
    | |  |  
    | |  |   
+3

將只有三個過程,第一個孩子不'fork()的''因爲'&&捷徑。 – 2012-07-10 20:10:42

+0

好點。固定。 – sshannin 2012-07-10 20:18:09

+0

我怎麼能知道哪個處理if語句會是真的嗎?@DanielFischer – gyosko 2012-07-12 16:46:41

0

fork()函數調用返回0到子進程和進程ID給父進程。基本上,這只是分叉一次。如果進程是父進程,則跳轉到下一個塊,然後子進程再次分叉。這一進程的父跳轉到下一個塊,並在此塊中的孩子執行在if語句的代碼。