【问题标题】:Does a function exist that searches the unix $PATH variable and returns true if a certain file exists?是否存在搜索 unix $PATH 变量并在某个文件存在时返回 true 的函数?
【发布时间】:2010-09-24 14:51:05
【问题描述】:

execvp() 函数执行作为参数给出的程序。它检查 $PATH 变量以找到程序。我正在写一些东西,我想在调用任何 exec() 函数之前检查是否存在多个程序。最好的方法是什么?

【问题讨论】:

  • 您可能不应该仅仅依赖于存在 - 您还需要文件具有执行权限(对您而言)。即使这样也不是万无一失的。如果程序启动#!/bin/non-existent,它不会执行,因为程序不存在。这就是为什么 execlp() 只是依次尝试每个名称的原因,我相信。

标签: c linux unix


【解决方案1】:

您可以使用 getenv 获取 PATH 环境变量,然后搜索它。

http://www.opengroup.org/onlinepubs/000095399/functions/getenv.html

然后您可以使用 fopen 检查特定二进制名称是否存在。

你也可以做类似 system("which App").它会为你搜索 $PATH。

http://en.wikipedia.org/wiki/System_(C_standard_library)

http://en.wikipedia.org/wiki/Which_(Unix)

【讨论】:

    【解决方案2】:

    glibc 和 netbsd 的 execvp 实际上会尝试为路径上的每个元素执行命令,直到它成功或用完搜索路径。不会留下太多的重复使用空间,但看起来不错。

    一般来说,对于这样的问题,我喜欢去源头看看它的作用。 NetBSD 通常是最好的读物:

    【讨论】:

    • 代码实际上是在 execvp 上,而不是 execlp(NetBSD 链接已经指向 execvp);我将您的答案编辑为您可能想要的(如果我弄错了,请随时回复)。
    【解决方案3】:

    命令which可能就是你想要的。

    【讨论】:

      【解决方案4】:

      一旦有了绝对(规范化)路径名,您就可以使用 stat(2) 或 access(2) 来查看文件是否存在。

      有统计:

      struct stat st;
      if (stat(path, &st)) {
         // path doesn't exist
      }
      

      访问权限:

      if (access(path, F_OK)) {
         // path doesn't exist
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多