介绍
- 使用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” 没有在终端被打印出来。