在代码(.c文件)中如何找到linux发行版名称版本

时间:2011-10-19 16:24:27

标签: c++ c

我想在代码(.c文件)中知道如何找到linux发行版名称版本(如ubuntu 10.0.4或centOS 5.5 ......)? 我正在寻找的c函数应该像(.c文件)中使用的uname()系统调用来获取内核版本。 可以理解,该功能适用​​于所有Linux发行版(标准版)
我不希望通过使用代码(.c文件)中的命令行linux来获取分发名称和版本(就像使用系统(“cat / etc / release ”);)。

任何建议都将不胜感激!

此致

7 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

嗯,您可以(并且应该)使用fopenfgets代替system("cat")来阅读/etc/release

虽然没有通用的方法,我甚至可以构建一个根本没有文件系统的linux映像(initramfs除外),绝对没有分发名称。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

运行一些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

答案 5 :(得分:0)

没有可移植的方法,你必须使用一些操作系统检测工具/库。

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

(我使用了傀儡,非常好。)

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

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

答案 6 :(得分:0)

我经常检查/ etc / issue;虽然(正如其他人指出的那样)并不能保证,但我在这个领域非常可靠。 据我所知,它适用于ubuntu,debian,redhat,centos,slackware和archlinux。