我想在代码(.c文件)中知道如何找到linux发行版名称版本(如ubuntu 10.0.4或centOS 5.5 ......)?
我正在寻找的c函数应该像(.c文件)中使用的uname()系统调用来获取内核版本。
可以理解,该功能适用于所有Linux发行版(标准版)
我不希望通过使用代码(.c文件)中的命令行linux来获取分发名称和版本(就像使用系统(“cat / etc / release ”);)。
任何建议都将不胜感激!
此致
答案 0 :(得分:3)
目前还没有标准。您可以查询以下文件或检查是否存在:
/etc/lsb-release
/etc/issue
/etc/*release
/etc/*version
答案 1 :(得分:1)
嗯,您可以(并且应该)使用fopen
和fgets
代替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。