1. 程式人生 > >linux中fork()函式詳解(原創!!例項講解)

linux中fork()函式詳解(原創!!例項講解)

    所以打印出結果:
    0 parent 2043 3224 3225
    0 child  3224 3225    0

    第二步:假設父程序p3224先執行,當進入下一個迴圈時,i=1,接著執行fork,系統中又新增一個程序p3226,對於此時的父程序,p2043->p3224(當前程序)->p3226(被建立的子程序)。
    對於子程序p3225,執行完第一次迴圈後,i=1,接著執行fork,系統中新增一個程序p3227,對於此程序,p3224->p3225(當前程序)->p3227(被建立的子程序)。從輸出可以看到p3225原來是p3224的子程序,現在變成p3227的父程序。父子是相對的,這個大家應該容易理解。只要當前程序執行了fork,該程序就變成了父程序了,就打印出了parent。
    所以打印出結果是:
    1 parent 2043 3224 3226
    1 parent 3224 3225 3227
 
    第三步:第二步建立了兩個程序p3226,p3227,這兩個程序執行完printf函式後就結束了,因為這兩個程序無法進入第三次迴圈,無法fork,該執行return 0;了,其他程序也是如此。
    以下是p3226,p3227打印出的結果:
    1 child     1 3227    0
    1 child     1 3226    0

    細心的讀者可能注意到p3226,p3227的父程序難道不該是p3224和p3225嗎,怎麼會是1呢?這裡得講到程序的建立和死亡的過程,在p3224和p3225執行完第二個迴圈後,main函式就該退出了,也即程序該死亡了,因為它已經做完所有事情了。p3224和p3225死亡後,p3226,p3227就沒有父程序了,這在作業系統是不被允許的,所以p3226,p3227的父程序就被置為p1了,p1是永遠不會死亡的,至於為什麼,這裡先不介紹,留到“三、fork高階知識”講。
    總結一下,這個程式執行的流程如下: