Linux 程序控制 exec「金蟬脫殼」

2021-04-26 15:26:14 字數 2539 閱讀 7328

說是exec系統呼叫,實際上在linux中,並不存在乙個exec()的函式形式,exec指的是一組函式,一共有6個,分別是:

#include 

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp);

int execv(const char *path, char *const argv);

int execvp(const char *file, char *const argv);

int execve(const char *path, char *const argv, char *const envp);

其中只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。

exec函式族的作用是根據指定的檔名找到可執行檔案,並用它來取代呼叫程序的內容,換句話說,就是在呼叫程序內部執行乙個可執行檔案。這裡的可執行檔案既可以是二進位制檔案,也可以是任何linux下可執行的指令碼檔案。

與一般情況不同,exec函式族的函式執行成功後不會返回,因為呼叫程序的實體,包括**段,資料段和堆疊等都已經被新的內容取代,只留下程序id等一些表面上的資訊仍保持原樣,頗有些神似"三十六計"中的"金蟬脫殼"。看上去還是舊的軀殼,卻已經注入了新的靈魂。只有呼叫失敗了,它們才會返回乙個-1,從原程式的呼叫點接著往下執行。

現在我們應該明白了,linux下是如何執行新程式的,每當有程序認為自己不能為系統和擁護做出任何貢獻了,他就可以發揮最後一點餘熱,呼叫任何乙個exec,讓自己以新的面貌重生;或者,更普遍的情況是,如果乙個程序想執行另乙個程式,它就可以fork出乙個新程序,然後呼叫任何乙個exec,這樣看起來就好像通過執行應用程式而產生了乙個新程序一樣。

事實上第二種情況被應用得如此普遍,以至於linux專門為其作了優化,我們已經知道,fork會將呼叫程序的所有內容原封不動的拷貝到新產生的子程序中去,這些拷貝的動作很消耗時間,而如果fork完之後我們馬上就呼叫exec,這些辛辛苦苦拷貝來的東西又會被立刻抹掉,這看起來非常不划算,於是人們設計了一種"寫時拷貝(copy-on-write)"技術,使得fork結束後並不立刻複製父程序的內容,而是到了真正實用的時候才複製,這樣如果下一條語句是exec,它就不會白白作無用功了,也就提高了效率。

/* exec.c */

#include

main()

;char *argv_execv=;

char *argv_execvp=;

char *argv_execve=;

if(fork()==0)

if(execl("/bin/echo", "echo", "executed by execl", null)<0)

perror("err on execl");

if(fork()==0)

if(execlp("echo", "echo", "executed by execlp", null)<0)

perror("err on execlp");

if(fork()==0)

if(execle("/usr/bin/env", "env", null, envp)<0)

perror("err on execle");

if(fork()==0)

if(execv("/bin/echo", argv_execv)<0)

perror("err on execv");

if(fork()==0)

if(execvp("echo", argv_execvp)<0)

perror("err on execvp");

if(fork()==0)

if(execve("/usr/bin/env", argv_execve, envp)<0)

perror("err on execve");

}

程式裡呼叫了2個linux常用的系統命令,echo和env。echo會把後面跟的命令列引數原封不動的列印出來,env用來列出所有環境變數。

由於各個子程序執行的順序無法控制,所以有可能出現乙個比較混亂的輸出--各子程序列印的結果交雜在一起,而不是嚴格按照程式中列出的次序。

編譯並執行:

linux程序控制 exec系列

說是exec系統呼叫,實際上在linux中,並不存在乙個exec 的函式形式,exec指的是一組函式,一共有6個,分別是 include int execl const char path,const char arg,int execlp const char file,const char ar...

Linux程序控制(二)exec

4.執行另乙個程式 exec系列函式 子程序經常要呼叫exec函式執行另乙個程式,程序id不變,exec系列函式有7種 include int execl const char pathname,const char arg0,int execv const char pathname,char c...

Linux程序控制 exec函式族

1 簡介 在linux中,並不存在exec 函式,exec指的是一組函式,一共有6個,分別是 include extern char environ int execl const char path,const char arg,int execlp const char file,const c...