Linux系統程式設計 exec函式族

2021-10-05 11:00:01 字數 2197 閱讀 5631

fork 建立子程序之後執行的是和父程序相同的程式(可能執行不同的**分支)。

子程序呼叫exec函式執行另一程式,該程序的使用者空間**和資料完全被新程式替換,從新程式的啟動例程開始執行。

exec並不傳建立新程序,所以呼叫exec前後該程序的id並未改變。

exec函式族

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 示...