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