fork 和 exec 是如何工作的?
我沒有太多經驗,只是試圖參與他們如何從使用者級別解釋到硬體的過程。
因此,當從 shell 觸發命令時,
fork()
繼承它的子程序並將exec()
子程序載入到記憶體並執行。
- 如果子程序包含了父程序(也就是原程序)的所有屬性,那麼這個子程序需要什麼?原始程序也可能已載入到記憶體中。
- 這個
fork
和exec
概念是否適用於 UNIX 中的所有可執行程序?像 shell 腳本一樣還是只針對命令?它是否也適用於 shell 內置命令?- 如果我將執行命令/腳本,何時使用寫入時複製概念?
很抱歉一次問了很多問題,但是當我想到任何命令執行時,所有這些問題都會在我腦海中浮現。
因此,當從 shell 觸發命令時,fork() 會繼承它的子程序,而 exec() 會將子程序載入到記憶體中並執行。
不完全的。
fork()
複製目前程序,創建一個相同的子程序。 將新程序exec()
載入到目前程序中,替換現有程序。我的問題是:
如果子程序包含了父程序(也就是原程序)的所有屬性,那麼這個子程序需要什麼?原始程序也可能已載入到記憶體中。
需要是因為父程序還不想終止;它希望一個新流程在繼續執行的同時啟動並做一些事情。
這個 fork 和 exec 概念是否適用於 UNIX 中的所有可執行程序?也適用於 shell 腳本或僅適用於命令?它是否也適用於 shell 內置命令?
對於外部命令,shell 會執行 a
fork()
以使命令在新程序中執行。內置程序只是由 shell 直接執行。另一個值得注意的命令是,它無需先ing 就將exec
shell 告知exec()
外部程序。fork()
這意味著 shell 本身被新程序替換,因此該程序退出時不再存在。如果你說,exec true
, then/bin/true
將替換你的 shell,並立即退出,在你的終端中不再執行任何東西,所以它會關閉。如果我將執行命令/腳本,何時使用寫時複製概念?
回到石器時代,
fork()
實際上不得不將呼叫程序中的所有記憶體複製到新程序中。Copy on Write 是一種優化,其中設置了頁表,以便兩個程序開始共享所有相同的記憶體,並且僅在需要時複製任一程序寫入的頁面。