2012-04-08 156 views
1

基於這個SO postexample,我期望當我使用fork()時,將允許我以非阻塞方式執行system/execvp。但是,當我嘗試在上述示例代碼中的fork塊中發出長時間運行的子進程時,該控件不會返回到父塊,直到子結束。使用fork的C++程序中的非阻塞系統調用

你可以告訴一個方法,我應該如何設計代碼以允許在C/C++代碼中對系統進行非阻塞調用。此外,我計劃編寫一個程序,其中不止一個孩子是從同一個父母派生出來的。我怎樣才能得到孩子們的pid?

感謝你的幫助。

+1

請添加一些代碼來說明你在做什麼。 – 2012-04-08 21:19:32

回答

3

fork將立即返回到子和父兩者。但是,該示例(test3.c)調用wait4,它聽起來像等待另一個進程執行某些操作(在本例中爲exit)。

+0

謝謝。解決了這個問題。你還可以告訴我,如果我必須發出很多流程,叉子的相同方法是否會起作用。另外,當我使用fork得到一個子進程的PID時,它會給出0.如何獲得正確的PID? – user984260 2012-04-08 21:26:53

+2

這就是叉的工作原理。它將子進程的PID返回給父進程,並將其返回給子進程。如果這沒有發生,那麼沒有(簡單的)方法來確定哪個進程是哪個進程。基本上,如果你需要自己的PID,你必須按照通常的方式得到它,現在我不記得了,但我相信你可以查看它。 – 2012-04-08 21:32:52

+2

@ user984260'fork'返回父進程中新進程的PID。在孩子中,它返回0.要獲得當前進程的PID,你可以調用'getpid'。手冊頁是你的朋友! – 2012-04-08 21:33:29

1

提到的示例代碼等待孩子產卵後返回 - 這就是爲什麼它會阻止。

要獲得子進程的PID,使用fork的返回值()。 fork()是返回兩個不同值的單個系統代碼 - 父進程的子進程號和子進程的進程號。這就是爲什麼你可以區分你的程序中應該由父母和孩子執行的代碼塊。

參考man叉(2)。

另一件事你應該注意有關fork()和wait()有,經過子進程退出內核仍持有一些關於它的信息(例如,退出狀態),應以某種方式消耗掉。否則,這個過程將變成'zombie'(ps輸出中的Z)。這是等待*()調用完成的工作。此外,小孩退出其父後由內核以SIGCHLD通知。如果你不想處理孩子的返回值,你可以通知系統你將忽略SIGCHLD與signal(),sigaction()等等。在這種情況下,附加數據會自動收回。這種行爲可能是您系統上的默認行爲,但仍然建議您明確聲明此類行爲以提高程序的可移植性。