使用C语言获取操作系统名称 [适用于Linux,可移植到以下发行版:Centos,Debian,Fedora,OpenSUSE,RedHat,Ubuntu]

5
我知道可以使用这个简单的命令来检查我的操作系统名称:lsb_release -ds。但我也知道,在我需要的所有平台上它不是可移植的。我尝试了struct utsname info;uname(&info),它们运行良好,但只给出“基本”名称——“Linux”。
有没有一种可移植(C语言)的方法来获取完整的操作系统名称?至少在Centos、Debian、Fedora、OpenSUSE、RedHat、Ubuntu之间是可移植的吗?谢谢。

你为什么要问呢?难道不能直接使用 uname 系统调用吗?为什么?换句话说,为什么从 C 程序中猜测你的 Linux 是 Debian 还是 Mint 或 Gentoo 如此重要? - Basile Starynkevitch
4个回答

3

这里是能够显示操作系统名称的 C 语言代码。您也可以使用相同的逻辑编辑代码以实现其他不同的目的。

#include<stdio.h>

int main()
{
    FILE *fp;
    char buffer[50] = " ";
    fp = popen("lsb_release -ds", "r");
    fgets(buffer, 50, fp);
    pclose(fp);
    printf("Name of the OS is : %s",buffer);
    return 0;
}

最好使用/usr/bin/lsb_release而不是仅使用lsb_release(用户可能已更改其PATH)。 - Basile Starynkevitch
@BasileStarynkevitch 嗯,你可以给出任何命令,我只是展示了它的实现方式。 - Megharaj
Fedora默认情况下没有lsb_release ;) - Brian Brown

3

在名称中,lsb_release表示“Linux标准基础”,但并不那么标准。

我找到了以下代码:https://github.com/myaut/tsload/blob/master/agent/lib/libhostinfo/plat/linux/uname.c

它会检查以下内容:

  • Oracle Enterprise Linux的/etc/oracle-release
  • RHEL和其他衍生版本的/etc/redhat-release
  • SuSE衍生版本的/etc/SuSE-release
  • 任何其他Linux系统的lsb_release输出

它还会去除无关的单词,例如 CentOS release 6.3 (Final) 变成 CentOS 6.3


2
您可以尝试使用popen(3)来运行并读取命令/usr/bin/lsb_release -ds的输出。如果失败了,您可以读取和解析/etc/issue

请注意,聪明或多疑的系统管理员可能会随意编辑和配置该/etc/issue文件。

但我不明白为什么您想要知道所有这些(从一个C程序内部),换句话说,为什么uname系统调用不够用。

特别是,有许多Debian(或Redhat)衍生的专业发行版,我不明白为什么特定发行版的名称对于C程序很重要。它对于打包目的更为重要....


是的,我在这里使用了 popen,但我担心一些没有 lsb_release 的操作系统 :) /etc/issue 在我所问的所有操作系统上都可用吗? - Brian Brown
好的,我应该选择一种更简单的方法,我将cat /etc/issue ;) 但是它在我询问的每个操作系统上都可用吗? - Brian Brown
也许 C 程序根本不在乎...它是为用户服务的。 - James Morris
1
我最近看到一个系统,其中 /etc/issue 被大量编辑,不再包含任何操作系统信息。不确定 /etc/issue.net 是否也被编辑了;它可能是一个可行的备选方案。此外,Debian/Ubuntu 系统似乎有一个 /etc/debian_version 文件,您可以参考。 - oliver

1
< p > uname系统调用可以在sysname字段中提供通用的系统类型(在所有情况下都是Linux),但它还会在releaseversionmachine字段中提供其他数据。 release字段将提供内核版本,version字段将提供一般的系统版本,在您提到的各种Linux变体中将有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接