extern char **environ;
int execl( const char *path, const char *arg, ...);
int execlp( const char *file, const char *arg, ...);
int execle( const char *path, const char *arg
, ..., char * const envp[]);
int execv( const char *path, char *const argv[]);
int execvp( const char *file, char *const argv[]);
这些 函数 的 第一个 参数 是 待执行 程序 的 路径名(文件名).
在 函数 execl, execlp, 和 execle 中, const char *arg 以及 省略号 代表 的 参数 可被 视为 arg0, arg1, ..., argn. 他们 合起来 描述了 指向 null 结尾的 字符串 的 指针 列表, 即 执行程序 的 参数列表. 作为 约定, 第一个 arg 参数 应该 指向 执行程序名 自身. 参数列表 必须 用 NULL 指针 结束!
execv 和 execvp 函数 提供 指向 null 结尾的 字符串 的 指针数组 作为 新程序 的 参数列表. 作为 约定, 指针数组 中 第一个 元素 应该 指向 执行程序名 自身. 指针数组 必须 用 NULL 指针 结束!
execle 函数 同时 说明了 执行进程 的 环境(environment), 他 在 NULL 指针 后面 要求 一个 附加参数, NULL 指针 用于 结束 参数列表, 或者说, argv 数组. 这个 附加参数 是 指向 null 结尾的 字符串 的 指针数组, 他 必须 用 NULL 指针 结束! 其他 函数 从 当前进程 的 environ 外部变量 中 获取 新进程 的 环境.
某些 函数 有 特殊的 语义.
如果 提供的 文件名 中 不包含 斜杠符(/), 函数 execlp 和 execvp 将 同 shell 一样 搜索 执行文件. 搜索路径 由 环境变量 PATH 指定. 如果 该 变量 不存在, 则 使用 缺省路径 ``:/bin:/usr/bin''. 另外, 某些 错误 要 特殊处理.
如果 对 某个 文件 的 访问 遭到 拒绝 ( execve 返回 EACCES), 这些 函数 将 在 搜索路径 中 继续 寻找. 如果 没有 找到 符合的 文件, 他们 返回时 把 errno 置为 EACCES.
如果 无法 识别 文件首部 ( execve 返回 ENOEXEC), 这些 函数 将 以 文件名 作为 第一个 参数 调用 shell. (如果 这个 尝试 失败 就 不再 进行 搜索 了.)
当 试图 执行 程序 并且 发生 错误 的 时候, execlp 和 execvp 的 行为 是 历史 习惯, 但是 没有 进入 正式文档, 也没有 被 POSIX 标准 说明. BSD (可能 还有 其他 系统) 中 进程 自动 进入 睡眠, 如果 发生 ETXTBSY, 他们 就 重试. 而 Linux 视此为 严重错误, 并且 立即 返回.
传统的 做法中, 函数 execlp 和 execvp 忽略 所有 错误, 除了 上述的 错误, ENOMEM 和 E2BIG. 如果 发生 这三类 错误, 他们 就 返回. 而 现在的 做法是, 不仅仅 上述的 错误, 任何 错误 均导致 函数 返回.