加载并运行程序(execve)
execve 是一个系统调用,用于在当前进程中加载并运行一个全新的程序。
功能:execve 用新程序的代码和数据完全替换当前进程的用户级上下文。新程序的代码段、数据段、堆和栈全部初始化,当前进程中原有的程序内容被丢弃。
保留的属性:尽管程序被替换了,但操作系统认为这还是同一个进程,因此以下属性保持不变:
- PID(进程ID):不改变。
- 父进程关系:父进程不变。
- 打开文件描述符:除非设置了
FD_CLOEXEC,否则保持打开。 - 信号处理设置:默认信号处理方式重置。
与fork的配合:execve 通常与 fork 配合使用:fork 创建子进程的副本,子进程立即调用 execve 加载新程序。这样父进程可以继续执行原程序,子进程运行新程序——这就是Shell执行外部命令的底层机制。
典型用法:
char *argv[] = {"/bin/ls", "-l", NULL};
char *envp[] = {"PATH=/usr/bin", NULL};
execve("/bin/ls", argv, envp);如果 execve 成功,它不会返回;如果失败,返回 -1。
链接到
- 上一个知识点:8.11 僵尸进程与孤儿进程
- 下一个知识点:8.13 信号概念