EXECVEAT - Linux手册页

时间:2019-08-20 17:58:39  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2017-09-15

名称

execveat-执行相对于目录文件描述符的程序

语法

#包括

int execveat(int dirfd,const char * pathname
char * const argv [],char * const envp [],
int标志);

说明

execveat()系统调用执行由dirfd和pathname组合引用的程序。除了本手册页中所述的区别外,它的运行方式与execve(2)完全相同。

如果在路径名中给定的路径名​​是相对的,则相对于文件描述符dirfd所引用的目录(而不是相对于调用进程的当前工作目录,相对于execve(2)相对路径名所做的)来解释它。 )。

如果路径名是相对的并且dirfd是特殊值AT_FDCWD,则路径名将相对于调用进程的当前工作目录(例如execve(2))进行解释。

如果路径名是绝对的,则dirfd被忽略。

如果路径名是空字符串并且指定了AT_EMPTY_PATH标志,则文件描述符dirfd指定要执行的文件(即dirfd指向可执行文件而不是目录)。

flags参数是一个位掩码,可以包含零个或多个以下标志:

AT_EMPTY_PATH
如果路径名是空字符串,请对dirfd引用的文件进行操作(该文件可能已使用open(2)O_PATH标志获得)。
AT_SYMLINK_NOFOLLOW
如果由dirfd标识的文件和非NULL路径名是符号链接,则调用失败,错误为ELOOP。

返回值

成功时,execveat()不返回。如果出错,则返回-1,并正确设置errno。

错误说明

execve()也可能发生与execve(2)相同的错误。 execveat()可能会发生以下其他错误:

EBADF
dirfd不是有效的文件描述符。
EINVAL
标志中指定的标志无效。
ELOOP
标志包括AT_SYMLINK_NOFOLLOW和由dirfd标识的文件,并且非NULL路径名是符号链接。
ENOENT
由dirfd和路径名标识的程序需要使用解释器程序(例如,以"#!"开头的脚本),但是文件描述符dirfd是用O_CLOEXEC标志打开的,结果程序文件不可访问。推出口译员。参见错误。
ENOTDIR
pathname是相对的,dirfd是引用目录以外的文件的文件描述符。

版本

execveat()已添加到内核3.19中的Linux中。 GNU C库支持正在等待中。

遵循规范

execveat()系统调用是特定于Linux的。

备注

除了openat(2)中解释的原因外,还需要execveat()系统调用,以允许在未安装/ proc文件系统的系统上实现fexecve(3)。

当要求执行脚本文件时,传递给脚本解释器的argv [0]是格式为/ dev / fd / N或/ dev / fd / N / P的字符串,其中N是文件号通过dirfd参数传递的描述符。当采用AT_EMPTY_PATH时,会出现第一种形式的字符串。当同时通过dirfd和pathname指定脚本时,会出现第二种形式的字符串。在这种情况下,P是路径名中给出的值。

出于与fexecve(3)中所述相同的原因,使用execveat()时的自然习惯是在dirfd上设置close-on-exec标志。 (但请参阅错误。)

BUGS

上述ENOENT错误意味着无法在以下形式的调用的文件描述符上设置close-on-exec标志:

execveat(fd,""",argv,envp,AT_EMPTY_PATH);

但是,无法设置close-on-exec标志意味着引用该脚本的文件描述符泄漏到脚本本身。除了浪费文件描述符外,在脚本递归使用execveat()的情况下,这种泄漏还可能导致文件描述符耗尽。

另外参见

execve(2),openat(2),fexecve(3)

出版信息

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