目录
简介
exec 函数族是 Linux 系统中的系统调用函数,它们都以 exec 开头,共有 6 个,分别是 execl
、execle
、execlp
、execv
、execve
、execvp
,使用 exec 函数可以将当前的进程替换为一个新进程,且新进程与原进程具有相同的 PID。
函数原型
c
#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
:指定传递给可执行文件的一系列参数,以可变参数列表的形式,一般第一个参数为可执行文件的名称,且最后一个参数必须是NULL
。file
:若参数中包含"/
"则视为路径并在指定路径下查找可执行文件,否则将在PATH
环境变量指定的路径中查找可执行文件。envp
:指定新进程的环境变量,不使用当前的环境变量。argv
:指定传递给可执行文件的一系列参数,以参数数组的形式,且该数组最后一个元素必须是NULL
。
返回值
- 成功:不返回,从新程序的 main 函数开始执行。
- 失败:返回 -1,继续执行原程序。
函数区别
分别以函数中的字符 l
、p
、v
、e
说明:
l
:表示使用参数列表的形式传递参数。p
:表示使用文件名,若不指定路径,将在 PATH 环境变量指定的路径中查找可执行文件。v
:表示使用参数数组的形式传递参数。e
:表示要使用新的环境变量给新进程。
使用示例
采用参数列表传递参数,以 execl 为例
- 示例程序
c
// main.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("--- main begin ---\n");
execl("./test", "test", "Hello World!", (char *)NULL);
printf("--- main end ---\n");
return 0;
}
// test.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%s: %s \r\n", argv[0], argv[1]);
return 0;
}
- 执行效果如下:
采用参数数组传递参数,以 execv 为例
- 示例程序
c
// main.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char *argv[] = {"test", "Hello World!", (char *)NULL};
printf("--- main begin ---\n");
execv("./test", argv);
printf("--- main end ---\n");
return 0;
}
// test.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%s: %s \r\n", argv[0], argv[1]);
return 0;
}
- 执行效果如下:
调用 PATH 下可执行文件,以 execlp 为例
- 示例程序
c
// main.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("--- main begin ---\n");
execlp("ps", "ps", "-l", (char *)NULL);
printf("--- main end ---\n");
return 0;
}
- 执行效果如下:
使用新的环境变量给新进程,以 execle 为例
- 示例程序
c
// main.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char *env_init[] = {"AA=aa", "BB=bb", NULL};
printf("--- main begin ---\n");
execle("./test", "test", "Hello World!", (char *)NULL, env_init);
printf("--- main end ---\n");
return 0;
}
// test.c
#include <stdio.h>
extern char **environ;
int main(int argc, char *argv[])
{
printf("%s: %s \r\n", argv[0], argv[1]);
for (char **ptr = environ; *ptr != 0; ptr++)
{
printf("%s\n", *ptr);
}
return 0;
}
- 执行效果如下: