我希望获得二进制文件的绝对路径(特别是7zip' s 7z)。我认为这可以通过
来完成获取$ PATH环境变量,并检查每个目录中是否存在7z,或
"炮轰"从哪个命令和从它的标准读取。
哪种方法最常规?
答案 0 :(得分:5)
第一种方法(使用getenv("PATH")
并扫描它......)更可取,效率更高......这通常是which
通常所做的事情(但不要不依赖which
,其行为可能会发生很大变化......)但您不会fork(2)任何流程(以及fork
或system
或which
可能会失败)。
但是,我怀疑为什么你需要找到一些可执行文件的路径。你可以简单地使用execvp(3)(以及类似的exec*p*
函数,所有这些函数都相当于getenv("PATH")
,然后在execve(2)之前执行程序
(在你忽视的非常病态的情况下,getenv("PATH")
可能会失败)
请注意,二进制文件executable可以在您测试其存在(并在PATH
中找到它)和您的时刻之间被删除(或添加或损坏...) {3}} - 它。并且execve
可能由于多种原因而失败(很少),或者没有按预期工作(特别是,如果您的7z
可执行文件所依赖的某些共享库已损坏或被删除)。
不要忘记在Linux上,有几个进程可以读取和写入(或执行)同一个文件(在读取时也可以删除或重命名 )。请详细了解execve(2)。
因此,在7z
之前找到execvp
的完整路径是错误的 - 或者是不准确的:在路径检查后,其他一些程序可能已删除或重新安装7z
在i-nodes之前。我不明白为什么要扫描PATH
,我认为它通常没用,请留给execvp
另请参阅execve(2),wordexp(3),glob(3)
由于Linux发行版上的大多数软件都是glob(7),因此您可以(也许您应该)研究它们的源代码。对于which
,它通常是您内置的shell(bash
,free software,zsh
都是自由软件),或来自fish
的程序(也许不是debianutils),我不确定大多数发行版都有它(其中一些发行版默认不会安装它)。
PS。我的感觉是你的代码不应该使用通常在大多数Linux系统上都不可用的7z
- 而不是我的系统;您可能隐含地要求您的用户安装它(至少文档)。您可能更喜欢tar
个归档到zip
个归档,请注意coreutils是一个POSIX标题!请参阅tar.h问题并考虑libtar