1. exec系列函数概述
exec系列函数是Unix/Linux系统编程中一组用于加载新程序的重要系统调用。它们允许当前进程完全替换为另一个可执行程序,同时保持原有的进程ID不变。这组函数在shell实现、进程管理和系统服务启动等场景中扮演着关键角色。
exec函数族包含多个变体,每个变体在参数传递和环境处理方面有所不同:
- execl()
- execv()
- execle()
- execve()
- execlp()
- execvp()
这些函数都基于同一个核心功能:用磁盘上的新程序替换当前进程的代码段、数据段、堆栈等内存空间。与fork()不同,exec不会创建新进程,而是对现有进程进行"变身"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. exec函数工作原理
2.1 基本执行流程
当调用exec函数时,内核会执行以下操作:
- 验证文件是否存在且具有可执行权限
- 读取可执行文件的头部信息
- 分配新的地址空间
- 加载程序代码和数据到内存
- 设置新的堆栈
- 将控制权转移给新程序的入口点
整个过程完成后,原进程的所有代码都被替换,但以下属性保持不变:
- 进程ID(PID)
- 父进程ID(PPID)
- 文件描述符(除非设置了FD_CLOEXEC标志)
- 工作目录
- 信号处理设置
2.2 参数传递机制
exec函数通过两种主要方式接收参数:
- 列表形式(execl/execlp/execle):
c复制execl("/bin/ls", "ls", "-l", "/home", NULL);
- 数组形式(execv/execvp/execve):
c复制char *args[] = {"ls", "-l", "/home", NULL};
execv("/bin/ls", args);
无论哪种形式,参数列表都必须以NULL指针结束。第一个参数通常是程序名称,后续是命令行参数。
3. exec函数变体详解
3.1 基础变体对比
| 函数名称 | 参数形式 | 环境处理 | PATH搜索 | 典型使用场景 |
|---|---|---|---|---|
| execl( |
