分类:
字符串数组参数:
execv()
execvp()
execve()
可变参数(printf()为典型的可变参数):
execl()
execlp()
execle()
其中:
字符 含义
v 第二个参数是数组
l 第二个参数之后是变参
p 第一个参数是文件名(否则要传路径)
e 最后一个参数是环境变量
PS:传变参时,最后一个参数填0表示变参结束,变参即无限制个数传入参数
原型:
#include <unistd.h>
char **environ;
int execl (const char *path, const char *arg0, ..., (char*)0);
int execlp(const char *file, const char *arg0, ..., (char*)0);
int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]);
int execv (const char *path, char *const argv[]);
int execvp(cosnt char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
char **environ;
int execl (const char *path, const char *arg0, ..., (char*)0);
int execlp(const char *file, const char *arg0, ..., (char*)0);
int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]);
int execv (const char *path, char *const argv[]);
int execvp(cosnt char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
返回值:
-1 失败
不返回 成功
本质:
覆盖程序。
特点:
1.一次调用,失败返回。
2.取代原有程序:
PID不变,地址空间中的所有内容(数据空间,代码,堆栈)变成所调用的函数代码。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern char ** environ;
int main(int argc,char** argv){
printf("%s,PID %d\n",argv[0],getpid());
//execl("/bin/ps","ps","-a","-o","pid,ppid,cmd",0);
//execlp("ps","ps","-a","-o","pid,ppid,cmd",0);
//execle("/bin/ps","ps","-a","-o","pid,ppid,cmd",0,environ);
char* args[] = {"ps","-a","-o","pid,ppid,cmd",0};
//execv("/bin/ps",args);
execve("/bin/ps",args,environ);
//execvp("ps",args);
printf("%s,PID %d\n",argv[0],getpid());
//execlp()
//execle()
}