【问题标题】:in the code (.c file) how I can find the linux distribution name version在代码(.c 文件)中我如何找到 linux 发行版名称版本
【发布时间】:2011-12-11 02:19:55
【问题描述】:

我想知道如何在代码(.c 文件)中找到 linux 发行版名称版本(如 ubuntu 10.0.4 或 centOS 5.5...)? 我正在寻找的 c 函数应该类似于(.c 文件)中用于获取内核版本的 uname() 系统调用。 值得赞赏的是,该功能适用​​于所有 linux 发行版(标准)
我不希望通过代码(.c 文件)使用命令行 linux 来获取发行版名称和版本(例如使用 system("cat /etc/release");)。

任何建议将不胜感激!

问候

【问题讨论】:

  • 通过 fopen/fread 读取 /etc/release 怎么样?

标签: c++ c


【解决方案1】:

我通常检查 /etc/issue;虽然(正如其他人指出的那样)不能保证,但我发现该领域非常可靠。 据我体验,它适用于 ubuntu、debian、redhat、centos、slackware 和 archlinux。

【讨论】:

    【解决方案2】:

    没有便携的方法可以做到这一点,您必须使用一些操作系统检测工具/库。

    幸运的是,那里有一些。我知道那两个:

    (我通过puppet使用了facter,非常好。)

    通过一些额外的脚本,您可以使用其中一个程序的输出来生成一个 .h,然后您可以在您的代码中使用它。

    您甚至可以将这一代作为一个步骤集成到您的 makefile 中。

    【讨论】:

      【解决方案3】:

      是否可以运行一些 shell 命令?

      $ /usr/bin/lsb_release -r
      Release:        11.04
      
      $ /usr/bin/lsb_release -d
      Description:    Ubuntu 11.04
      
      $ /usr/bin/lsb_release -rd
      Description:    Ubuntu 11.04
      Release:        11.04
      

      【讨论】:

        【解决方案4】:

        您可以fopen("/etc/lsb-release") 并解析其内容。它看起来像这样:

        DISTRIB_ID=Ubuntu
        DISTRIB_RELEASE=10.04
        DISTRIB_CODENAME=lucid
        DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS"
        

        这种方法不通用。您需要确保它适用于您关心的所有发行版(如果不适用,我建议您使用@ott-- 的答案)。

        【讨论】:

        • 不错,但在许多发行版上都失败了(例如,这在 Arch 上不起作用)。真正的答案可以通过查看/etc 结构、init 风格、包管理器等来找到。
        【解决方案5】:

        目前还没有标准。您可以查询以下文件或检查是否存在:

        /etc/lsb-release
        /etc/issue
        /etc/*release
        /etc/*version
        

        【讨论】:

        • 不仅没有标准,也没有要求发行版必须有名称(至少在系统本身上,必须有人提供源代码)
        【解决方案6】:

        AFAIK 如果 uname(2) 没有为您提供足够的信息,则没有标准的系统调用来获取此信息。
        最安全的方法可能是检查“/proc/version”并阅读它

        【讨论】:

          【解决方案7】:

          好吧,您可以(并且应该)使用fopenfgets 而不是system("cat") 来阅读/etc/release

          虽然没有通用的方法,但我什至可以构建一个完全没有文件系统(除了 initramfs)并且绝对没有发行版名称的 linux 映像。

          【讨论】:

          • 查看我对 aix 答案的评论。例如,我的 Arch 没有 /etc/release
          • @cnicutar:阅读我回答的后半部分。
          猜你喜欢
          • 2011-09-13
          • 1970-01-01
          • 2015-06-17
          • 1970-01-01
          • 2011-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多