星巡研究院

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