複製鏈接
請複製以下鏈接發送給好友

exec函數族

鎖定
exec函數族提供了一個在進程中啓動另一個程序執行的方法。它可以根據指定的文件名或目錄名找到可執行文件,並用它來取代原調用進程的數據段、代碼段和堆棧段,在執行完之後,原調用進程的內容除了進程號外,其他全部被新的進程替換了。另外,這裏的可執行文件既可以是二進制文件,也可以是Linux下任何可執行的腳本文件。
中文名
exec函數族
外文名
The exec family of functions
定    義
在進程中啓動另一個程序執行
使用情況
兩種
領    域
計算機
學    科
計算機原理

exec函數族函數性質

exec函數族提供了一個在進程中啓動另一個程序執行的方法。它可以根據指定的文件名或目錄名找到可執行文件,並用它來取代原調用進程的數據段、代碼段和堆棧段,在執行完之後,原調用進程的內容除了進程號外,其他全部被新的進程替換了。另外.這裏的可執行文件既可以是二進制文件,也可以是Linux下任何可執行的腳本文件。 [1] 

exec函數族使用情況

使用exec函數族主要有兩種情況:
(1)當進程認為自己不能再為系統和用户做出任何貢獻時,就可以調用exec函數族中的任意一個函數讓自己重生。
(2)如果一個進程想執行另一個程序,那麼它就可以調用fork函數新建一個進程,然後調用exec函數族中的任意一個函數,這樣看起來就像通過執行應用程序而產生了一個新進程(這種情況非常普遍)。
exec函數族共有6種不同形式的函數。這6個函數可以劃分為兩組:
(1)execl、execle和execlp。
(2)execv、execve和execvp。
這兩組函數的不同在於exec後的第一個字符,第一組是l,在此稱,為execl系列;第二組是v,在此稱為execv系列。這裏的l是list(列表)的意思,表示execl系列函數需要將每個命令行參數作為函數的參數進行傳遞;而v是vector(矢量)的意思,表示execv系列函數將所有函數包裝到一個矢量數組中傳遞即可。
exec函數的原型如下:
int execl(const char * path,const char * arg,…);
int execle(const char * path,const char * arg,char * const envp[]);
int execlp(const char * file,const char * arg,…);
int execv(const char * path,char * const argv[]);
int execve(const char * path,char * const argv[],char * const envp[]);
int execvp(const char * file,char * const argv[]);
參數説明:
path:要執行的程序路徑。可以是絕對路徑或者是相對路徑。在execv、execve、execl和execle這4個函數中,使用帶路徑名的文件名作為參數。
file:要執行的程序名稱。如果該參數中包含“/”字符,則視為路徑名直接執行;否則視為單獨的文件名,系統將根據PATH環境變量指定的路徑順序搜索指定的文件。
argv:命令行參數的矢量數組。
envp:帶有該參數的exec函數可以在調用時指定一個環境變量數組。其他不帶該參數的exec函數則使用調用進程的環境變量。
arg:程序的第0個參數,即程序名自身。相當於argv[O]。
…:命令行參數列表。調用相應程序時有多少命令行參數,就需要有多少個輸入參數項。注意:在使用此類函數時,在所有命令行參數的最後應該增加一個空的參數項(NULL),表明命令行參數結束。
返回值:一1表明調用exec失敗,無返回表明調用成功。 [1] 
參考資料
  • 1.    劉志強主編;王曉強,莊旭菲,李文靜副主編,基於項目驅動的嵌入式Linux應用設計開發,清華大學出版社,2016.07,第269頁