在C on a*nix系统中,查找二进制文件';带$path或";的绝对路径;哪个;?

在C on a*nix系统中,查找二进制文件';带$path或";的绝对路径;哪个;?,c,linux,C,Linux,我希望得到二进制文件的绝对路径(特别是7zip的7z)。我认为这两种方法都可以做到 获取$PATH环境变量,并检查每个目录中是否存在7z,或 “炮击”到该命令并从其标准输出读取 哪种方法是最传统的?第一种方法(使用getenv(“路径”)并扫描它……)更可取、更有效。。。这通常是哪个通常会做的事情(但不要依赖于哪个的行为可能会有很大的变化…),但您不会选择任何流程(并且分叉或系统或哪个可能会失败) 但是,我质疑为什么需要找到某些可执行文件的路径。在执行该程序时,您可以简单地使用(以及类似的exe

我希望得到二进制文件的绝对路径(特别是7zip的7z)。我认为这两种方法都可以做到

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

  • “炮击”到该命令并从其标准输出读取

  • 哪种方法是最传统的?

    第一种方法(使用
    getenv(“路径”)
    并扫描它……)更可取、更有效。。。这通常是
    哪个
    通常会做的事情(但不要依赖于
    哪个
    的行为可能会有很大的变化…),但您不会选择任何流程(并且
    分叉
    系统
    哪个
    可能会失败)

    但是,我质疑为什么需要找到某些可执行文件的路径。在执行该程序时,您可以简单地使用(以及类似的
    exec*p*
    函数,所有函数都执行与
    getenv(“PATH”)
    等效的操作,然后像以前一样在内部扫描它)

    (在您可以忽略的非常病态的情况下,
    getenv(“路径”)
    可能会失败)

    请注意,在测试二进制文件的存在性(并在
    路径中找到它)和删除二进制文件之间,二进制文件可能会被删除(或添加,或损坏…)。而且,
    execve
    可能由于多种原因而失败(很少),或者不能像您期望的那样工作(特别是,如果您的
    7z
    可执行文件所依赖的某个共享库已损坏或被删除)

    不要忘记,在Linux上,几个进程可以读写(或执行)同一个文件(也可以在读取时删除或重命名)。请阅读更多关于

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

    另见

    因为Linux发行版上的大多数软件都是,所以您可以(也许您应该)研究它们的源代码。对于
    ,它通常是shell的内置(和
    bash
    ,都是免费软件)或来自的程序(可能不是),我不确定大多数发行版是否有它(其中一些默认情况下不会安装)

    注:我的感觉是,您的代码不应该使用
    7z
    ,这在大多数Linux系统上通常不可用,在我的系统上也不可用;您可能隐含地要求您的用户安装它(至少要记录它)。您可能更喜欢
    tar
    存档而不是
    zip
    存档,注意这是一个POSIX头!请参阅问题并考虑<代码> LBTAR < /COD>

    < P>第一种方法(使用<代码> GETEnV(“PATH”)< /代码>和扫描它……)是更好的和更有效的…这通常是
    哪个
    通常会做的事情(但不要依赖于
    哪个
    的行为可能会有很大的变化…),但您不会选择任何流程(并且
    分叉
    系统
    哪个
    可能会失败)

    但是,我质疑为什么需要找到某些可执行文件的路径。在执行该程序时,您可以简单地使用(以及类似的
    exec*p*
    函数,所有函数都执行与
    getenv(“PATH”)
    等效的操作,然后像以前一样在内部扫描它)

    (在您可以忽略的非常病态的情况下,
    getenv(“路径”)
    可能会失败)

    请注意,在测试二进制文件的存在性(并在
    路径中找到它)和删除二进制文件之间,二进制文件可能会被删除(或添加,或损坏…)。而且,
    execve
    可能由于多种原因而失败(很少),或者不能像您期望的那样工作(特别是,如果您的
    7z
    可执行文件所依赖的某个共享库已损坏或被删除)

    不要忘记,在Linux上,几个进程可以读写(或执行)同一个文件(也可以在读取时删除或重命名)。请阅读更多关于

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

    另见

    因为Linux发行版上的大多数软件都是,所以您可以(也许您应该)研究它们的源代码。对于
    ,它通常是shell的内置(和
    bash
    ,都是免费软件)或来自的程序(可能不是),我不确定大多数发行版是否有它(其中一些默认情况下不会安装)


    注:我的感觉是,您的代码不应该使用
    7z
    ,这在大多数Linux系统上通常不可用,在我的系统上也不可用;您可能隐含地要求您的用户安装它(至少要记录它)。您可能更喜欢
    tar
    存档而不是
    zip
    存档,注意这是一个POSIX头!请参阅问题并考虑<代码> LBTART>/代码>

    ,我倾向于<代码> > <代码>。好了,反正它是*nix中的
    $PATH
    ,如果有专门用于此目的的程序,为什么要使用这种自建方法?请解释并激发你为什么需要获得
    7z
    二进制文件的绝对路径;我猜这是错误的(或者非常不寻常,除非您正在编写shell及其程序哈希表),其想法是让用户在配置文件中指定二进制文件的绝对路径,并基于$path提供默认值。但是我想我会根据下面的信息重新考虑这个设计,可能会默认使用execvp(3),除非配置文件