介紹
- 使用fork創建一個進程之后,經常會在新進程中調用exec函數執行別的程序
- 當前進程調用exec函數之后,這個進程會被完全替代換成新的程序,即便如此仍然是同一個進程,進程ID不變
- 函數族 execl execlp execle execvp execvpe
- 頭文件 <unistd.h>
- 功能:在進程中執行一個可執行文件,gcc -o xxx.c xxx
- 返回值:成功無返回值;失敗返回 -1,并且從源程序的調用點繼續執行
#include <unistd.h>
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 execvpe(const char *file, char *const argv[],char *const envp[]);
- 參數說明:
- 第一個參數path為可執行文件的路徑和名字;arg:可執行程序所帶的參數
- 第二個參數之后當做該文件的argv[0]、argv[1]等,最后一個參數必須用NULL作為結束
- file:如果參數file中包含/,則就將其視為路徑名,否則就按 PATH環境變量,在它所指定的各目錄中搜尋可執行文件
- exec族最后一位的使用含義
- l : 使用參數列表
- p:使用文件名,并從PATH環境進行尋找可執行文件
- v:應先構造一個指向各參數的指針數組,然后將該數組的地址作為這些函數的參數。
- e:多了envp[]數組,使用新的環境變量代替調用進程的環境變量
例子
#include <cstdio>
#include <unistd.h>int main(void ){printf("before execl\n");if (execl("/home/gsc/Projects/stress_test/test/Test_output","first","second",NULL) == -1){printf("execel failed!\n");}printf("after execel\n");
}
//Test_output.c
#include <stdio.h>int main(int argc,char* argv[]){for (int i=0;i<argc;i++){printf("argv[%d]:%s\n",i,argv[i]);}
}

- 實驗說明:
- 先用gcc編譯Test_output.c,生成可執行文件Test_output并放在當前路徑下。文件Test_output的作用是打印命令行參數。
- 然后再編譯main.c,用execl 找到并執行Test_output,將當前進程main替換掉,所以”after execl” 沒有在終端被打印出來。