备注

默认搜索路径(在环境不包含变量PATH时使用)显示系统之间的某些差异。它通常包括/ bin和/ usr / bin(按此顺序),并且还可能包括当前的工作目录。在某些其他系统上,当前的工作包含在/ bin和/ usr / bin之后,作为反特洛伊木马措施。 glibc实现长期遵循传统的默认设置,在该默认设置中,当前工作目录包含在搜索路径的开头。但是,在glibc 2.24开发过程中进行了一些代码重构,导致当前工作目录从默认搜索路径中完全删除。这种意外的行为更改被认为具有一定的好处,不会被恢复。

尝试执行文件时发生错误时execlp()和execvp()的行为是历史性做法,但是传统上没有记录在案,并且POSIX标准未指定。如果遇到ETXTBSY,BSD(可能还有其他系统)会自动进行睡眠并重试。 Linux将其视为硬错误,并立即返回。

传统上,函数execlp()和execvp()会忽略所有错误,但上述错误以及ENOMEM和E2BIG除外,它们会在返回时返回。现在,如果发生上述错误以外的任何错误,它们将返回。

名称

execl,execlp,execle,execv,execvp,execvpe-执行文件

返回值

exec()函数仅在发生错误时返回。返回值为-1,并且将errno设置为指示错误。

错误说明

所有这些功能都可能失败,并为execve(2)指定的任何错误设置errno。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
execl(),execle(),execv()Thread safetyMT-Safe
execlp(),execvp(),execvpe()Thread safetyMT-Safe env

说明

exec()系列函数将当前过程映像替换为新的过程映像。本手册页中描述的功能位于execve(2)之上。 (有关替换当前过程映像的更多详细信息,请参见execve(2)的手册页。)

这些函数的初始参数是要执行的文件的名称。

可以基于" exec"前缀后面的字母对功能进行分组。

l - execl(), execlp(), execle()

可以将const char * arg及其后的省略号视为arg0arg1,...,argn。它们一起描述了一个或多个指向以空值结尾的字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。参数列表必须以空指针终止,并且由于它们是可变参数函数,因此该指针必须强制转换为(char *)NULL。

与" l"函数相比," v"函数(如下)将执行程序的命令行参数指定为向量。

v - execv(), execvp(), execvpe()

char * const argv []参数是一个指向以空值结尾的字符串的指针的数组,这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。指针数组必须以空指针终止。

e - execle(), execvpe()

调用者的环境通过参数envp指定。 envp参数是指向以null终止的字符串的指针的数组,并且必须以null指针终止。

所有其他exec()函数(后缀中不包含'e')从调用过程中的外部变量环境获取新过程映像的环境。

p - execlp(), execvp(), execvpe()

如果指定的文件名不包含斜杠(/)字符,则这些函数将在搜索可执行文件时复制外壳程序的操作。在PATH环境变量中指定的目录路径名的冒号分隔列表中查找该文件。如果未定义此变量,则路径列表默认为包含confstr(_CS_PATH)返回的目录(通常返回值" / bin:/ usr / bin")以及当前工作目录的列表。有关更多详细信息,请参见注释。

如果指定的文件名包含斜杠字符,则将忽略PATH,并执行位于指定路径名的文件。

此外,某些错误会得到特别处理。

如果拒绝了文件许可(尝试的execve(2)失败,错误为EACCES),这些功能将继续搜索其余的搜索路径。但是,如果找不到其他文件,它们将以errno设置为EACCES返回。

如果无法识别文件头(尝试的execve(2)失败,并显示错误ENOEXEC),则这些函数将以文件的路径作为第一个参数执行shell(/ bin / sh)。 (如果此尝试失败,则不会进行进一步的搜索。)

所有其他exec()函数(后缀中不包含" p")都将标识相对应的程序(相对或绝对)路径名作为其第一个参数。

EXEC - Linux手册页

Linux程序员手册 第3部分
更新日期: 2019-08-02

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

BUGS

在glibc 2.24之前,execl()和execle()在内部使用realloc(3),因此不是异步信号安全的,这违反了POSIX.1的要求。此问题已在glibc 2.24中修复。

Architecture-specific details

在sparc和sparc64上,内核(具有上面显示的原型)作为系统调用提供execv(),以与SunOS兼容。这些体系结构上的execv()包装函数未使用此函数。

另外参见

sh(1),execve(2),execveat(2),fork(2),ptrace(2),fexecve(3),system(3),environ(7)

语法

#include <unistd.h>

extern char **environ;

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

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

execvpe():_ GNU_SOURCE

遵循规范

POSIX.1-2001,POSIX.1-2008。

execvpe()函数是GNU扩展。

版本

execvpe()函数首先出现在glibc 2.11中。

日期:2019-08-20 18:00:13 来源:oir作者:oir