我正在用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能为你做到这一点.
stat?sh 远远超出您的需要。
签出access()系统调用。
if (access(filename, F_OK|X_OK) == 0)
{
/* You can execute this file. */
}
Run Code Online (Sandbox Code Playgroud)
请注意,对文件访问或文件是否存在的任何检查都具有固有的竞争条件。execve自检查发生之时起,您无法保证有人没有删除可执行文件,更改文件所有权,删除文件等。在编写代码并决定如何处理错误条件时,请记住这一点。
| 归档时间: |
|
| 查看次数: |
9984 次 |
| 最近记录: |