在* nix系统的C中,找到$ PATH或"的二进制绝对路径"?

时间:2015-11-21 20:27:25

标签: c linux

我希望获得二进制文件的绝对路径(特别是7zip' s 7z)。我认为这可以通过

来完成
  1. 获取$ PATH环境变量,并检查每个目录中是否存在7z,或

  2. "炮轰"从哪个命令和从它的标准读取。

  3. 哪种方法最常规?

1 个答案:

答案 0 :(得分:5)

第一种方法(使用getenv("PATH")并扫描它......)更可取,效率更高......这通常是which 通常所做的事情(但不要不依赖which,其行为可能会发生很大变化......)但您不会fork(2)任何流程(以及forksystemwhich可能会失败)。

但是,我怀疑为什么你需要找到一些可执行文件的路径。你可以简单地使用execvp(3)(以及类似的exec*p*函数,所有这些函数都相当于getenv("PATH"),然后在execve(2)之前执行程序

(在你忽视的非常病态的情况下,getenv("PATH")可能会失败)

请注意,二进制文件executable可以在您测试其存在(并在PATH中找到它)和您的时刻之间被删除(或添加或损坏...) {3}} - 它。并且execve可能由于多种原因而失败(很少),或者没有按预期工作(特别是,如果您的7z可执行文件所依赖的某些共享库已损坏或被删除)。

不要忘记在Linux上,有几个进程可以读取和写入(或执行)同一个文件(在读取时也可以删除重命名 )。请详细了解execve(2)

因此,在7z之前找到execvp的完整路径是错误的 - 或者是不准确的:在路径检查后,其他一些程序可能已删除或重新安装7zi-nodes之前。我不明白为什么要扫描PATH,我认为它通常没用,请留给execvp

另请参阅execve(2)wordexp(3)glob(3)

由于Linux发行版上的大多数软件都是glob(7),因此您可以(也许您应该)研究它们的源代码。对于which,它通常是您内置的shell(bashfree softwarezsh都是自由软件),或来自fish的程序(也许不是debianutils),我不确定大多数发行版都有它(其中一些发行版默认不会安装它)。

PS。我的感觉是你的代码不应该使用通常在大多数Linux系统上都不可用的7z - 而不是我的系统;您可能隐含地要求您的用户安装它(至少文档)。您可能更喜欢tar个归档到zip个归档,请注意coreutils是一个POSIX标题!请参阅tar.h问题并考虑libtar