2011-04-19 73 views
2

所以我有一个文件路径。如何检查它是否可执行? (UNIX,C++)有文件路径如何检查它是否可执行?

+0

“可执行文件”,这对您意味着什么?例如。 Python脚本文件(与#!/ usr/bin/python一样的shebang)? – 2011-04-19 16:41:24

+0

你以前的帖子有重复吗? http://stackoverflow.com/questions/5719438/how-to-find-out-if-path-leads-to-executable-file – Void 2011-04-19 16:56:32

回答

7

检查的权限(状态)位。

#include <sys/stat.h> 

bool can_exec(const char *file) 
{ 
    struct stat st; 

    if (stat(file, &st) < 0) 
     return false; 
    if ((st.st_mode & S_IEXEC) != 0) 
     return true; 
    return false; 
} 
+2

但这个答案“可以*某人*执行文件?”不是“可以*我*执行文件吗?”也许OP应该考虑[access(2)](http://linux.die.net/man/2/access)。 – 2011-04-19 16:52:18

+0

这将在mac os x上运行吗? – Rella 2011-04-19 23:12:05

+0

@Blender - 是的。 – 2011-04-20 13:57:57

5

访问(2):

#include <unistd.h> 

if (! access (path_name, X_OK)) 
    // executable 

呼叫至STAT(2)具有更高的开销填写该结构。除非你需要额外的信息。

+1

这可能是比我更好的解决方案;我忘记了access()'。 – 2011-04-19 17:01:39

+1

你是说access()不是自己做一个stat()和getpid(),getuid(),getgid()?我会想象,开销几乎是相同的。 – 2014-06-09 00:13:48

+0

access()的实现是未知的。但这不是我所说的 - 填写一个统计结构是有代价的。 – 2014-06-18 21:06:07

1

考虑使用access(2),检查用于相对于当前处理的uid权限和GID:

#include <unistd.h> 
#include <stdio.h> 

int can_exec(const char *file) 
{ 
    return !access(file, X_OK); 
} 

int main(int ac, char **av) { 
    while(av++,--ac) { 
     printf("%s: %s executable\n", *av, can_exec(*av)?"IS":"IS NOT"); 
    } 
} 
+0

这将在mac os x上工作吗? – Rella 2011-04-19 23:11:35

+0

@Blender - 根据[developer.apple.com](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/access.2.html),是的,这将在Mac OS X上工作。 – 2011-04-20 13:53:15

4

有一个在人页的底部一个警告以进行访问(2):

CAVEAT Access()是一个潜在的安全漏洞,不应该被使用。

请记住,在调用access()与路径字符串的时间与尝试执行由路径字符串引用的文件的时间之间存在争用条件,文件系统可能会更改。如果这种竞争条件是一个问题,首先用open()打开文件并使用fstat()来检查权限。

+0

我不确定open()/ fstat()会关闭手册页描述的争用条件。比赛是,在OP的情况下,该文件可以改变它在access()和execv()之间的可执行性。随着你的解决方案,它仍然可以在fstat()和execv()之间切换。我认为手册页作者的意图是你应该继续并调用execv() - 如果它失败了,那么你有你的答案。 – 2011-04-20 13:56:43

相关问题