加载并运行程序(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。

链接到