execve()
unistd.h
int execve(const char *pathname, char *const argv[], char *const envp[]);
用一个新程序替换当前进程映像,进程号不变,代码段与数据段整体替换。
# execve · 执行新程序
## 头文件
`unistd.h`
## 函数原型
`int execve(const char *pathname, char *const argv[], char *const envp[]);`
## 说明
execve 用磁盘上的一个新程序替换当前进程的代码段、数据段与堆栈。成功时原程序的剩余代码不会再执行(连返回值都拿不到);只有失败才返回 -1 并设置 errno。
三个参数:可执行文件路径、参数数组(约定第一个元素是程序名)、环境变量数组。
## 最小示例
```c
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"ls", "-l", NULL};
char *envp[] = {NULL};
if (execve("/bin/ls", argv, envp) < 0) { perror("execve"); return 1; }
return 0;
}
```
## 常见坑
- execve 成功后的代码误以为还会执行——要在调用前做好清理与日志落盘
- argv / envp 忘记以 NULL 结尾,导致内核读到越界数据
- 用相对路径或依赖 PATH 查找,换成 execve 后行为不一致
- 忘记处理失败分支,文件不存在时进程带着未初始化的状态往下走
## 相关函数
fork、execl、execlp、execvp、exit