2012-06-22 46 views
0
puts "Process #{Process.pid} started" 
return_value = fork 
puts "Process #{Process.pid} returned #{return_value}" 
puts "Process #{Process.pid} exited" 

以上紅寶石代碼印刷這個輸出STDOUT子進程返回nil爲叉呼叫

Process 6644 started 
Process 6644 returned 6645 
Process 6644 exited 
Process 6645 returned 
Process 6645 exited 

當父進程執行fork,它返回子進程的PID。當子進程調用fork爲什麼它返回nil,這不應該是遞歸類型的調用嗎?就像..孩子也會分叉另一個孩子的過程..而那個孩子的過程會分叉另一個過程..等等,我在這裏錯過了什麼嗎?

回答

1

這是如何區分代碼是在父進程還是在子進程中運行的代碼:父進程接收分叉子進程的PID,子進程得到nil

就個人而言,我更喜歡使用的語法:

pid = fork do 
    # this is the code that will be executed by the child 
end 

# this is the code executed by parent 

由於大部分的時間,孩子應該做的比父進程以外的東西,這反映了代碼的意圖好得多。

+0

如果我不使用_block_語法叉像是從問題的代碼,可我說,子進程只會在「fork」之後執行代碼,這就是子進程沒有執行「puts」的原因。Process#{Process.pid}啓動了「'? – JustForTest

0

我猜你缺少你指的紅寶石叉文檔調用帶有塊叉子執行它下面的代碼兩次一個父和其他的孩子(叉處理)與孩子叉回零

點我

你,如果你檢查你的輸出

Process 6644 started -- Parent Process Started 
Process 6644 returned 6645 -- Parent Process displaying the retrun value = child process id 
Process 6644 exited -- Parent Process exiting 
Process 6645 returned -- Child Process forked earlier and since there return value is nil 
Process 6645 exited -- Child Process exiting 

檢查紅寶石documentation叉子這種形式的叉聲明的是從中@psyho已經回答了塊東西悅目混亂。

我建議你使用遵循@psycho回答了同樣的聲明,因爲它是一個令人困惑的

希望這有助於