如何打开()`with`o_exec`与ecepve()`??

问题描述 投票:0回答:1

从启示中,

open()
有一个标志选项

O_EXEC仅为执行开放。

,但是,我只看到

execve()

在我见过的示例中使用。

那么

open()

什么时候使用

O_EXEC
?这与
execve()
有何不同?
    

c linux file exec
1个回答
0
投票
O_EXEC

在BSD衍生的系统中实施,例如Darwin。

这个想法是,它允许您在无需读取许可的情况下打开具有执行权限的文件。由此产生的归档者可以通过两种方式使用:

对于目录,您可以使用“ AT”呼叫(

openat
  1. fstatat
    utimensat
    等)来访问该目录中的文件。
    
    对于普通文件,您可以使用
    fexecve
  2. execveat
  3. syscall将其调用为程序。
    (“ AT”呼叫系列的想法是减轻各种种族条件攻击,在此查看文件上的权限,但是当您使用该文件时,文件或其祖先目录之一已更换,这意味着您实际上访问了其他一些文件。)
    
    以这种方式获得的打开文件描述符不允许您读取(或写)文件。您不能使用它在目录中获取文件名列表。
    
    linux具有类似的
  4. O_PATH
旗,但其工作方式略有不同。特别是,它不会检查何时打开实际执行权限的文件,并依赖于何时调用

fexecve

execveat

时进行检查。 (

fexecve

是库的调用而不是syscall。如果它足够新,它可能会尝试使用
execveat
syscall,但否则它将使用
execve
syscall和pathname这样的路径名。
在linux访问目录时必须使用
/proc/self/fd/fd_number
选项,但是请在可执行文件中保留时应使用它。
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.