EXEC - Linux手册页
Linux程序员手册 第3部分
更新日期: 2019-08-02
名称
execl,execlp,execle,execv,execvp,execvpe-执行文件
语法
#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
说明
exec()系列函数将当前过程映像替换为新的过程映像。本手册页中描述的功能位于execve(2)之上。 (有关替换当前过程映像的更多详细信息,请参见execve(2)的手册页。)
这些函数的初始参数是要执行的文件的名称。
可以基于" exec"前缀后面的字母对功能进行分组。
l - execl(), execlp(), execle()
可以将const char * arg及其后的省略号视为arg0,arg1,...,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()函数仅在发生错误时返回。返回值为-1,并且将errno设置为指示错误。
错误说明
所有这些功能都可能失败,并为execve(2)指定的任何错误设置errno。
版本
execvpe()函数首先出现在glibc 2.11中。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
execl(),execle(),execv() | Thread safety | MT-Safe |
execlp(),execvp(),execvpe() | Thread safety | MT-Safe env |
遵循规范
POSIX.1-2001,POSIX.1-2008。
execvpe()函数是GNU扩展。
备注
默认搜索路径(在环境不包含变量PATH时使用)显示系统之间的某些差异。它通常包括/ bin和/ usr / bin(按此顺序),并且还可能包括当前的工作目录。在某些其他系统上,当前的工作包含在/ bin和/ usr / bin之后,作为反特洛伊木马措施。 glibc实现长期遵循传统的默认设置,在该默认设置中,当前工作目录包含在搜索路径的开头。但是,在glibc 2.24开发过程中进行了一些代码重构,导致当前工作目录从默认搜索路径中完全删除。这种意外的行为更改被认为具有一定的好处,不会被恢复。
尝试执行文件时发生错误时execlp()和execvp()的行为是历史性做法,但是传统上没有记录在案,并且POSIX标准未指定。如果遇到ETXTBSY,BSD(可能还有其他系统)会自动进行睡眠并重试。 Linux将其视为硬错误,并立即返回。
传统上,函数execlp()和execvp()会忽略所有错误,但上述错误以及ENOMEM和E2BIG除外,它们会在返回时返回。现在,如果发生上述错误以外的任何错误,它们将返回。
BUGS
在glibc 2.24之前,execl()和execle()在内部使用realloc(3),因此不是异步信号安全的,这违反了POSIX.1的要求。此问题已在glibc 2.24中修复。
Architecture-specific details
在sparc和sparc64上,内核(具有上面显示的原型)作为系统调用提供execv(),以与SunOS兼容。这些体系结构上的execv()包装函数未使用此函数。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。