在C中实现Unix shell:检查文件是否可执行

rah*_*hmu 4 c unix

我正在用C实现一个Unix shell,我正在处理相对路径的问题.特别是在输入命令时.现在我每次都必须输入可执行文件的完整路径,而我更愿意简单地输入"ls"或"cat".

我设法获得$ PATH env变量.我的想法是将变量拆分为":"字符,然后将每个新字符串附加到命令名称并检查文件是否存在且是否可执行.

例如,如果我的PATH是:"/ bin:/ usr/bin"并且我输入"ls",我希望程序首先检查"/ bin/ls"是否存在且是否可执行,如果没有继续"/ USR /斌/".

两个问题:

1)这是一个好方法吗?(它不一定是最好的.我只是想确保它会起作用.

2)更重要的是,如果文件存在且可执行,我如何检入C?

我希望我足够清楚,并且......非常感谢:)

R..*_*R.. 10

别.执行此检查是错误的; 它固有地受到竞争条件的影响.相反,尝试使用适当的exec-family调用执行它.如果它不可执行,您将收到错误.

另请注意,您不需要PATH自己搜索; execvp能为你做到这一点.

  • 这是完全正确的.也许将此检查作为预验证的一种形式可能是有用的,但实际情况是,尝试运行它的任何事情都会告诉您它是否可以运行. (4认同)

asv*_*kau 6

stat?sh 远远超出您的需要。

签出access()系统调用。

if (access(filename, F_OK|X_OK) == 0)
{
    /* You can execute this file. */
}
Run Code Online (Sandbox Code Playgroud)

请注意,对文件访问或文件是否存在的任何检查都具有固有的竞争条件execve自检查发生之时起,您无法保证有人没有删除可执行文件,更改文件所有权,删除文件等。在编写代码并决定如何处理错误条件时,请记住这一点。

  • 不,“X_OK”还不够。您仍然需要调用 stat(2) 来查看它是否是一个文件,然后尝试执行它来查看它是否真的没问题。从精美的手册中可以看出:“X_OK 执行/搜索权限”,甚至“Access() 是一个潜在的安全漏洞,永远不应该使用”。 (2认同)