EXEC

EXEC

一簇函數
exec函數族,顧名思義,就是一簇函數,他把當前進程映像替換成新的程序文件,而且該程序通常main函數開始執行![1]用fork函數創建子進程後,子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程完全由新程序代換,而新程序則從其main函數開始執行。exec隻是用另一個新程序替換了當前進程的正文、數據、堆和棧段。這些exec函數都是UNIX進程控制原語。exit函數和兩個wait函數處理終止和等待終止。其中隻有execve是真正意義上的系統調用,其它都是在此基礎上經過包裝的庫函數。
    中文名:exec函數族 外文名:EXEC 定義: 概念:一簇函數 通常:main函數開始執行 領域:計算機

基本内容

1UNIX環境高級編程對EXEC的解釋編輯

用fork函數創建子進程後,子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程完全由新程序代換,而新程序則從其main函數開始執行。因為調用exec并不創建新進程,所以前後的進程ID并未改變。exec隻是用另一個新程序替換了當前進程的正文、數據、堆和棧段。有六種不同的exec函數可供使用,它們常常被統稱為exec函數。這些exec函數都是UNIX進程控制原語。用fork可以創建新進程,用exec可以執行新的程序。exit函數和兩個wait函數處理終止和等待終止。這些是我們需要的基本的進程控制原語。

說是exec系統調用,實際上在Linux中,并不存在一個exec()的函數形式,exec指的是一組函數,一共有6個,分别是:

#include

extern char**environ;

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下可執行的腳本文件,如果不是可以執行的文件,那麼就解釋成為一個shell文件,sh**執行!

上面6條函數看起來似乎很複雜,但實際上無論是作用還是用法都非常相似,隻有很微小的差别。

參數argc指出了運行該程序時命令行參數的個數,數組argv存放了所有的命令行參數,數組envp存放了所有的環境變量。環境變量指的是一組值,從用戶登錄後就一直存在,很多應用程序需要依靠它來确定系統的一些細節,我們最常見的環境變量是PATH,它指出了應到哪裡去搜索應用程序,如/bin;HOME也是比較常見的環境變量,它指出了我們在系統中的個人目錄。環境變量一般以字符串"XXX=xxx"的形式存在,XXX表示變量名,xxx表示變量的值。

值得一提的是,argv數組和envp數組存放的都是指向字符串的指針,這兩個數組都以一個NULL元素表示數組的結尾。

現在來看一下exec函數族,先把注意力集中在execve上:

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

execve第1個參數path是被執行應用程序的完整路徑,第2個參數argv就是傳給被執行應用程序的命令行參數,第3個參數envp是傳給被執行應用程序的環境變量。

在這裡有點要注意,不管是arg0,還是argv都必須是程序的可執行文件的名字,比如:

execl("/bin/echo","echo","executed by execl",NULL)中的echo;

execl("/bin/ls","ls","/azuo","-la",(char*)0)中的ls;

execlp("echo","echo","executed by execlp",NULL)中的echo;

留心看一下這6個函數還可以發現,前3個函數都是以execl開頭的,後3個都是以execv開頭的,它們的區别在于,execv開頭的函數是以"char*argv[]"這樣的形式傳遞命令行參數,而execl開頭的函數采用了我們更容易習慣的方式,把參數一個一個列出來,然後以一個NULL表示結束。這裡的NULL的作用和argv數組裡的NULL作用是一樣的。

這裡建議使用(char*)0代替NULL。

在全部6個函數中,隻有execle和execve使用了char*envp[]傳遞環境變量,其它的4個函數都沒有這個參數,這并不意味着它們不傳遞環境變量,這4個函數将把默認的環境變量不做任何修改地傳給被執行的應用程序。而execle和execve會用指定的環境變量去替代默認的那些。

還有2個以p結尾的函數execlp和execvp,咋看起來,它們和execl與execv的差别很小,事實也确是如此,除execlp和execvp之外的4個函數都要求,它們的第1個參數path必須是一個完整的路徑,如"/bin/ls";而execlp和execvp的第1個參數file可以簡單到僅僅是一個文件名,如"ls",這兩個函數可以自動到環境變量PATH制定的目錄裡去尋找。

執行

EXEC是EXECUTE的縮寫。

exec命令有兩個用法:執行一個存儲過程,或者執行一個動态批次。

相關詞條

相關搜索

其它詞條