基本內容
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命令有兩個用法:執行一個存儲過程
,或者執行一個動態批次。