跳转至内容

C 编程/POSIX 参考/unistd.h/exec

来自维基教科书,自由的教学读物

exec 函数集合是类 Unix 操作系统 中的函数,它们会导致正在运行的进程被传递给函数作为参数的程序完全替换。由于没有创建新的进程,进程标识符 (PID) 不会改变,但原始进程的数据、堆和栈会被新进程的数据、堆和栈替换。

execlexeclpexecvexecvp 调用中,新进程映像继承了当前的 环境变量

在执行 exec 调用时打开的文件在新进程中保持打开状态。此方面用于指定新进程的 标准流 (stdin、stdout 和 stderr)。

MS-DOS 环境中,使用 exec 函数之一执行的程序总是被加载到内存中,就好像程序可执行文件头中的“最大分配”被设置为默认值 0xFFFF。EXEHDR 实用程序可用于更改程序的最大分配字段。但是,如果执行此操作,并且使用 exec 函数之一调用程序,则该程序的行为可能与从操作系统命令行直接调用或使用 spawn 函数之一调用的程序的行为不同。

许多 Unix shell 还提供一个 exec 内置命令,用于用指定的程序替换 shell 进程。[1] 包装器 脚本通常使用此命令在设置环境变量或其他配置后运行程序(直接或通过 解释器虚拟机)。通过使用 exec,shell 程序使用的资源在启动程序后无需继续使用。[2]

这些函数在 unistd.h 头文件中声明用于 POSIX 标准,在 process.h 头文件中声明用于 DOS、OS/2 和 Windows。

int execl(const char *pathname, const char *arg0, ..., (char *) NULL);
int execle(const char *path, const char *arg0, ...,(char *) NULL, char const *envp[]);
int execlp(const char *file, const char *arg, ..., (char *) NULL);
int execv(const char *pathname, char const *argv[]);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execvp(const char *file, char *const argv[]);

一些实现提供这些函数,这些函数的名称前面带有下划线(例如 _execl)。

函数名称

[编辑 | 编辑源代码]

每个函数的基是 exec,后面跟着一个或多个字母

e - 一个指向 环境变量 的指针数组被显式地传递给新进程映像。
l - 命令行参数 被单独传递给函数。
p - 使用 PATH 环境变量 来查找要执行的 path 参数中指定的文件。
v - 命令行参数作为指针数组传递给函数。

path 参数指定作为新进程映像执行的文件的路径名。从 arg0 开始的参数是指向要传递给新进程映像的参数的指针。argv 值是指向参数的指针数组。

第一个参数 arg0 应该是可执行文件的名称。通常它与 path 参数的值相同。一些程序可能会错误地依赖此参数提供可执行文件的位置,但对此没有保证,而且它在不同平台上也没有标准化。

参数 envp 是指向环境设置的指针数组。以 e 结尾的 exec 调用通过 envp 参数传递环境设置列表来更改新进程映像的环境。此参数是一个指向以 null 结尾的字符串的指针数组。envp 数组必须以 NULL 指针结尾。

每个以 null 结尾的字符串都具有以下格式

name=value

其中 name 是环境变量名称,value 是该变量的值。envp 数组的最后一个元素必须为 null。如果 envp 本身是 null,则新进程将继承当前环境设置。

返回值

[编辑 | 编辑源代码]

通常,exec 函数将替换当前进程,因此它不能向原始进程返回任何内容。进程确实具有 退出状态,但该值由 父进程 收集。

如果 exec 函数确实返回到调用进程,则发生错误,返回值为 −1,并且 errno 被设置为以下值之一

名称 注释
E2BIG 参数列表超过系统限制。
EACCES 指定的文件存在锁定或共享冲突。
ENOENT 文件或路径名未找到。
ENOMEM 没有足够的内存来执行新进程映像。

参考资料

[编辑 | 编辑源代码]
  1. http://www.gnu.org/software/bash/manual/bashref.html#IDX74 - exec 内置命令在 bash 手册中
  2. http://tldp.org/LDP/abs/html/wrapper.html
[编辑 | 编辑源代码]
  • exec: 执行一个文件 – 系统接口参考,单一 UNIX® 规范,第 7 版,来自开放组
华夏公益教科书