5

我知道我可以用这个简单的命令检查我的操作系统名称:lsb_release -ds. 但我也知道,它不能在我需要它的所有平台上移植。我试过了struct utsname info;uname(&info)效果很好,但只给了我“基本”名称 - “Linux”。

是否有任何可移植(C)方式获取完整的操作系统名称?至少可以在 Centos、Debian、Fedora、OpenSUSE、RedHat、Ubuntu 之间移植?干杯

4

4 回答 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;
}
于 2013-09-12T17:29:57.083 回答
3

LSB 的名称lsb_release为“Linux Standard Base”,但并不那么标准。

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

它检查:

  • /etc/oracle-release对于 Oracle 企业 Linux
  • /etc/redhat-release对于 RHEL 其他衍生产品
  • /etc/SuSE-release对于 SuSE 衍生品
  • lsb_release任何其他 Linux 的输出

它还删除了不相关的词,即CentOS release 6.3 (Final)->CentOS 6.3

于 2015-03-11T10:55:53.820 回答
2

您可以尝试使用popen(3)运行并读取 command 的输出/usr/bin/lsb_release -ds。如果失败,您可能会阅读并解析/etc/issue

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

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

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

于 2013-09-12T17:19:19.737 回答
1

系统调用在字段中uname为您提供了通用系统类型(Linux在所有情况下)sysname,但它还在 、 和 字段中为您提供了额外releaseversion数据machine。该release字段将为您提供内核版本,该version字段将为您提供一般系统版本,这对于您提到的所有各种 linux 变体都会有所不同。

于 2013-09-12T17:59:22.380 回答