linux shell exec命令詳解
linux shell exec命令詳解
exec命令是linux下的一個命令,那它有什么用處呢?下面由學習啦小編為大家整理了exec命令的相關(guān)知識,希望大家喜歡!
linux shell exec命令
介紹
在bash下輸入man exec,找到exec命令解釋處,可以看到有”No new process is created.”這樣的解釋,這就是說exec命令不產(chǎn)生新的子進程。那么exec與source的區(qū)別是什么呢?
exec命令在執(zhí)行時會把當前的shell process關(guān)閉,然后換到后面的命令繼續(xù)執(zhí)行。
用法
1. 系統(tǒng)調(diào)用exec是以新的進程去代替原來的進程,但進程的PID保持不變。因此,可以這樣認為,exec系統(tǒng)調(diào)用并沒有創(chuàng)建新的進程,只是替換了原來進程上下文的內(nèi)容。原進程的代碼段,數(shù)據(jù)段,堆棧段被新的進程所代替。
一個進程主要包括以下幾個方面的內(nèi)容:
(1)一個可以執(zhí)行的程序
(2) 與進程相關(guān)聯(lián)的全部數(shù)據(jù)(包括變量,內(nèi)存,緩沖區(qū))
(3)程序上下文(程序計數(shù)器PC,保存程序執(zhí)行的位置)
2. exec是一個函數(shù)簇,由6個函數(shù)組成,分別是以excl和execv打頭的。
執(zhí)行exec系統(tǒng)調(diào)用,一般都是這樣,用fork()函數(shù)新建立一個進程,然后讓進程去執(zhí)行exec調(diào)用。我們知道,在fork()建立新進程之后,父進各與子進程共享代碼段,但數(shù)據(jù)空間是分開的,但父進程會把自己數(shù)據(jù)空間的內(nèi)容copy到子進程中去,還有上下文也會copy到子進程中去。而為了提高效率,采用一種寫時copy的策略,即創(chuàng)建子進程的時候,并不copy父進程的地址空間,父子進程擁有共同的地址空間,只有當子進程需要寫入數(shù)據(jù)時(如向緩沖區(qū)寫入數(shù)據(jù)),這時候會復制地址空間,復制緩沖區(qū)到子進程中去。從而父子進程擁有獨立的地址空間。而對于fork()之后執(zhí)行exec后,這種策略能夠很好的提高效率,如果一開始就copy,那么exec之后,子進程的數(shù)據(jù)會被放棄,被新的進程所代替。
3. exec與system的區(qū)別
(1) exec是直接用新的進程去代替原來的程序運行,運行完畢之后不回到原先的程序中去。
(2) system是調(diào)用shell執(zhí)行你的命令,system=fork+exec+waitpid,執(zhí)行完畢之后,回到原先的程序中去。繼續(xù)執(zhí)行下面的部分。
總之,如果你用exec調(diào)用,首先應該fork一個新的進程,然后exec. 而system不需要你fork新進程,已經(jīng)封裝好了。