fork 建立子程序之後執行的是和父程序相同的程式(可能執行不同的**分支)。exec函式族子程序呼叫exec函式執行另一程式,該程序的使用者空間**和資料完全被新程式替換,從新程式的啟動例程開始執行。
exec並不傳建立新程序,所以呼叫exec前後該程序的id並未改變。
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path,const char *arg, ... , const char * envp);
int execv(const char *path, char *const ar**);
int execvp(const char *file, char *const ar**);
int execve(const char *path, char *const ar**, char *const envp);
execlp函式載入乙個程序,借助path環境變數
// 成功:無返回; 失敗:-1
int execlp(const char *file, const char *arg, ...);
引數1:要載入的程式的名字。該函式需要配合pat環境變數來使用,當path中所有目錄搜尋後沒有引數1則出錯返回。
該函式通常用來呼叫系統程式。如:ls、date、cp、cat等命令。
// 乙個栗子
execlp("ls","ls","-l","-a",null);
execl函式載入乙個程序,通過 路徑 + 程式名 來載入。
// 成功:無返回; 失敗:-1
int execl(const char *path, const char *arg, ...);
可以用來載入自定義的程式。
// 乙個栗子
execl("/bin/ls", "ls", "-l, "-f",null);
// 自定義程式栗子
execl("./main", "main", null);
execvp函式載入乙個程序,使用自定義環境變數env
int execvp(const char *file, char *const ar**);
變數形式:①... ②ar**
變參終止條件:①null結尾 ②固定指定
execvp 與 execlp引數形式不同,原理一致。
一般規律
l(list)
命令列引數列表
p(path)
搜尋 file 時使用 path 變數
v(vector)
使用命令列引數陣列
e(environment)
使用環境變數陣列,不實用程序原有的環境變數,設定新引導程式執行的環境變數
事實上,只有execve是真正的系統呼叫,其他五個函式最終都呼叫execve,所以execve在man手冊的第2節,其他函式在man手冊第3節。這些函式之間的關係:
練習:列印當前程序資訊到檔案
#include #include #include #include int main(void)
// 複製檔案描述符
dup2(fd, stdout_fileno);
execlp("ps", "ps", "ax", null);
// 出錯處理
perror("exec error");
exit(1);
// 不會執行到這裡
// close(fd);
return 0;
}
linux系統程式設計 exec函式族
例項 include include include intmain void else if pid 1 else return0 hello.c 輸出自己pid和環境變數 include include extern char environ intmain void include inclu...
linux系統程式設計之exec函式族
linux函式exec函式族 這來函式是用來執行一些可執行檔案的,常用在fork出子程序後,在子程序中執行。也就是替換子程序的東西,子程序的東西全部被替換,但只是替換,不會產生乙個新的程序,程序的id號也不會改變。include extern char environ int execl const...
Linux系統程式設計之exec族函式
目錄 一 說在前面 二 函式介紹 2.1 函式原型 2.2 函式功能 2.3 函式引數 2.3.1引數傳遞方式 2.3.2 區別與不同 2.4 函式關係 三 例項歷程 3.1 execl 示例 3.2 execlp 示例 3.3 execv 示例 3.4 execvp 示例 3.6 execve 示...