exec指令在Linux中用來呼叫並執行指定的指令。通常在shell腳本中使用exec指令來執行其他指令。當在目前終端機中使用exec命令時,指定的命令執行完畢後會取代目前進程,而不是建立一個新的子進程。
exec [选项]
選項 | 意義 |
---|---|
-c | 使用一個空環境來執行 |
-a | shell會將名字當作零參數傳遞給執行的指令 |
-l | 在shell的開頭放置一個破折號參數傳遞給指令 |
// 首先使用echo命令将文本“www.linuxyz.cn”进行输出: [root@bunian ~]# echo www.bunian.cn www.bunian.cn // 然后再使用exec命令调用echo命令输出同样的信息,并且对输出的信息进行对比,输入指令如下所示: [root@bunian ~]# exec -c echo www.bunian.cn www.bunian.cn // 通过比较两者执行后的结果来看,所实现的功能是相同的,即使用exec命令调用echo命令成功。
// 查找bunian.txt 并备份为bunian.txt.bak [root@bunian ~]# find /test -name "bunian.txt" -exec cp {} {}.bak \;
一、系統呼叫 exec 是以新的進程去代替原來的進程,但進程的PID保持不變。因此,可以這樣認為,exec系統呼叫並沒有建立新的進程,只是取代了原來進程上下文的內容。原進程的程式碼段,資料段,堆疊段被新的進程所取代。
一個行程主要包括以下幾個面向的內容:
二、exec是一個函數簇,由6個函數組成,分別是以excl和execv打頭的。
執行exec系統調用,一般都是這樣,用fork()函數新建立一個進程,然後讓進程去執行exec調用。我們知道,在fork()建立新進程之後,父進各與子進程共享程式碼段,但資料空間是分開的,但父進程會把自己資料空間的內容copy到子進程中去,還有上下文也會copy到子進程中去。而為了提高效率,採用一種寫時copy的策略,即創建子進程的時候,並不copy父進程的地址空間,父子進程擁有共同的地址空間,只有當子進程需要寫入數據時(如向緩衝區寫入資料),這時候會複製位址空間,複製緩衝區到子程序中去。從而父子進程擁有獨立的位址空間。而對於fork()之後執行exec後,這種策略能夠很好的提高效率,如果一開始就copy,那麼exec之後,子進程的資料會被放棄,被新的進程所取代。
以上是Linux exec指令手冊的詳細內容。更多資訊請關注PHP中文網其他相關文章!