
大家好,接下来的一段时间我将开始学习野火的Linux 系统课程并将学习到的干货逐步更新到我的CSDN博客中。没时间刷课的同学可以把我的博客喂给AI 突击一下。
目录
[1、什么是 exec 函数族](#1、什么是 exec 函数族)
1、什么是 exec 函数族
exec 用来替换当前进程的程序,不会新建进程。调用后,当前进程的代码、数据直接被新可执行文件替换,进程 ID 不变;成功后原程序不再继续执行。
搭配:一般先用
fork()创建子进程,再在子进程调用 exec,让子进程跑别的程序。
2、后缀含义
| 后缀 | 含义 |
|---|---|
l |
list,可变参数列表 传参,参数逐个写,最后以NULL结尾 |
v |
vector,字符串数组 传参,把所有参数放进char* argv[]数组 |
p |
path,自动从PATH环境变量搜索可执行文件,不用写完整路径 |
e |
environment,自定义环境变量 ,传入envp[]数组替换默认环境 |
组合例子:
execlp= l + p;execve= v + e(execve 是 Linux 系统调用,其余都是库函数封装)
3、头文件
#include <unistd.h>
4、函数原型拆解
-
execl:l 后缀,参数列表,必须指定可执行文件完整路径int execl(const char *path, const char *arg, ...);
// 示例:execl("/bin/ls", "ls", "-l", NULL); -
execlp:l+p,参数列表 + 自动搜 PATH,可只写文件名不用全路径int execlp(const char *file, const char *arg, ...);
// 示例:execlp("ls", "ls", "-l", NULL); -
execv:v 后缀,参数数组,指定完整路径int execv(const char *path, char const argv[]);
// char argv[] = {"ls", "-l", NULL}; execv("/bin/ls", argv); -
execve:v+e,参数数组 + 自定义环境变量,真正的系统调用int execve(const char *path, char *const argv[], char *const envp[]);
5、返回值
- 成功:函数不返回 。exec 会直接替换当前进程的代码段、数据段,原来的程序代码直接消失,去运行新程序,后面代码不会执行。
- 失败:返回 -1,保留原进程上下文,可以继续往下执行,一般用 perror 查看错误。
6、核心原理
exec 系列函数不会创建新进程 !
fork()创建新进程(复制一份进程),然后在子进程里调用exec,把子进程替换成目标程序。
总结:
- l 列表,v 数组;p 找 PATH,e 换环境
- L 后缀和 V 后缀必须两者选其一来使用
- p 后缀和 e 后缀是可选的,可用可不用
- 组合后缀的相关函数还有很多,可自己进一步了解
- exce函数有可能执行失败,原因可能有以下几点:
- 新程序的文件路径出错
- 传参或者是自定义环境变量时,没有加NULL
- 新程序没有执行权限