从启示中,
open()
有一个标志选项
,但是,我只看到O_EXEC仅为执行开放。
execve()
在我见过的示例中使用。那么
open()
什么时候使用
O_EXEC
?这与execve()
?有何不同?
O_EXEC
在BSD衍生的系统中实施,例如Darwin。
这个想法是,它允许您在无需读取许可的情况下打开具有执行权限的文件。由此产生的归档者可以通过两种方式使用:
对于目录,您可以使用“ AT”呼叫(
openat
fstatat
,
utimensat
等)来访问该目录中的文件。对于普通文件,您可以使用
fexecve
或execveat
以这种方式获得的打开文件描述符不允许您读取(或写)文件。您不能使用它在目录中获取文件名列表。linux具有类似的
O_PATH
fexecve
execveat
fexecve
是库的调用而不是syscall。如果它足够新,它可能会尝试使用
execveat
syscall,但否则它将使用
execve
syscall和pathname这样的路径名。在linux访问目录时必须使用
/proc/self/fd/fd_number
选项,但是请在可执行文件中保留时应使用它。