fork後的exec

    由fork創建的新進程被稱爲子進程。子進程和父進程繼續執行fork調用之後的指令,子進程是父進程的一個副本。例如,子進程獲得父進程數據空間、堆和棧的副本。注意,這是子進程所擁有的副本。父子進程並不共享這些存儲空間部分。父子進程共享正文段。

    由於在fork後經常跟隨者exec,所以現在的很多實現並不執行一個父進程數據段、棧和堆的完全複製。作爲替代,使用了寫時複製技術,這些區域由父子進程共享,而內核將他們的訪問權限修改爲只讀,如果父子進程的人一個試圖修改這些區域,此時才爲修改區域的那塊內存製作一個副本,通常是虛擬存儲器系統的一個“頁”。

    fork之後若跟隨執行exec後,該進程執行的程序完全替換爲新程序,而新程序則從其main函數開始執行。因爲調用exec並不創建新進程,所以先後的進程ID並未改變。exec只是用一個全新的程序替換了當前進程的正文、數據、堆和棧段。

    總結下,fork後跟隨exec和fork後不跟隨exec的區別:

    1、fork後跟隨exec則新程序從其main函數開始執行,在新的程序啓動後,原來的程序就不再執行了,而不跟隨exec則程序執行fork調用後的指令段;

    2、fork後跟隨exec會產生一個全新的程序替換當前進程的正文、數據、堆和棧段,其進程ID不變,而不跟隨exec則父子進程共享正文段,且子進程獲得父進程的數據空間、堆和棧的副本。寫時複製技術則使得父子進程進行最大程度的共享,只有修改區域進行副本的製作;

    3、exec啓動的新進程繼承了原進程的許多特性,在原進程中已打開的文件描述符在新進程中仍將保持打開,除非指定了close on exec標誌,但需要注意,任何在原進程中已打開的目錄流都將在新進程中被關閉。

發佈了61 篇原創文章 · 獲贊 19 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章