我知道我可以用这个简单的命令检查我的操作系统名称:lsb_release -ds
. 但我也知道,它不能在我需要它的所有平台上移植。我试过了struct utsname info;
,uname(&info)
效果很好,但只给了我“基本”名称 - “Linux”。
是否有任何可移植(C)方式获取完整的操作系统名称?至少可以在 Centos、Debian、Fedora、OpenSUSE、RedHat、Ubuntu 之间移植?干杯
我知道我可以用这个简单的命令检查我的操作系统名称:lsb_release -ds
. 但我也知道,它不能在我需要它的所有平台上移植。我试过了struct utsname info;
,uname(&info)
效果很好,但只给了我“基本”名称 - “Linux”。
是否有任何可移植(C)方式获取完整的操作系统名称?至少可以在 Centos、Debian、Fedora、OpenSUSE、RedHat、Ubuntu 之间移植?干杯
这是表示操作系统名称的 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;
}
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
您可以尝试使用popen(3)运行并读取 command 的输出/usr/bin/lsb_release -ds
。如果失败,您可能会阅读并解析/etc/issue
请注意,聪明或偏执的系统管理员可能会随意编辑和配置该/etc/issue
文件。
但我不明白你为什么想知道所有这些(从C程序内部),换句话说,为什么uname
系统调用还不够。
特别是,有很多 Debian(或 Redhat)派生的专门发行版,我不明白为什么特定发行版的名称对C程序很重要。对于包装目的而言,它更重要......
系统调用在字段中uname
为您提供了通用系统类型(Linux
在所有情况下)sysname
,但它还在 、 和 字段中为您提供了额外release
的version
数据machine
。该release
字段将为您提供内核版本,该version
字段将为您提供一般系统版本,这对于您提到的所有各种 linux 变体都会有所不同。