导读:本期聚焦于小伙伴创作的《c++如何通过读取/etc/os-release获取Linux发行版系统信息》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《c++如何通过读取/etc/os-release获取Linux发行版系统信息》有用,将其分享出去将是对创作者最好的鼓励。

在Linux环境下开发跨发行版的程序时,获取当前系统的发行版信息是很常见的需求。/etc/os-release是systemd定义的标准文件,几乎所有现代Linux发行版都会在该文件中存储系统名称、版本、ID等核心信息,通过c++读取并解析这个文件就能拿到所需的系统数据。

c++如何通过读取/etc/os-release获取Linux发行版系统信息

了解/etc/os-release文件结构

首先我们可以先看一下该文件的典型内容,不同发行版的内容会有差异,但格式统一为键值对形式,部分值会用双引号包裹:

NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

c++读取解析的实现思路

整个实现流程可以分为三个步骤:

  • 使用c++标准库的文件操作接口打开/etc/os-release文件
  • 逐行读取文件内容,跳过空行和注释行
  • 对每一行内容进行拆分,提取键和值,去除值两侧可能存在的双引号,最后存储到合适的数据结构中

完整实现代码

下面是完整的c++实现示例,使用标准库完成所有操作,不需要依赖第三方库:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <map>
#include <algorithm>

// 去除字符串两侧的空白字符
std::string trim(const std::string& str) {
    size_t first = str.find_first_not_of(" tnrfv");
    if (first == std::string::npos) {
        return "";
    }
    size_t last = str.find_last_not_of(" tnrfv");
    return str.substr(first, last - first + 1);
}

// 去除值的双引号包裹
std::string remove_quotes(const std::string& str) {
    std::string result = str;
    if (result.size() >= 2 && result.front() == '"' && result.back() == '"') {
        result = result.substr(1, result.size() - 2);
    }
    return result;
}

// 读取并解析/etc/os-release文件,返回键值对映射
std::map<std::string, std::string> parse_os_release() {
    std::map<std::string, std::string> os_info;
    std::ifstream file("/etc/os-release");
    
    // 判断文件是否成功打开
    if (!file.is_open()) {
        std::cerr << "无法打开/etc/os-release文件" << std::endl;
        return os_info;
    }
    
    std::string line;
    while (std::getline(file, line)) {
        // 跳过空行和注释行
        line = trim(line);
        if (line.empty() || line[0] == '#') {
            continue;
        }
        
        // 查找等号分割键值
        size_t delimiter_pos = line.find('=');
        if (delimiter_pos == std::string::npos) {
            continue;
        }
        
        std::string key = trim(line.substr(0, delimiter_pos));
        std::string value = trim(line.substr(delimiter_pos + 1));
        // 去除值的双引号
        value = remove_quotes(value);
        
        if (!key.empty()) {
            os_info[key] = value;
        }
    }
    
    file.close();
    return os_info;
}

int main() {
    auto os_info = parse_os_release();
    
    // 输出常见的系统信息字段
    std::cout << "系统名称: " << os_info["NAME"] << std::endl;
    std::cout << "系统版本: " << os_info["VERSION"] << std::endl;
    std::cout << "系统ID: " << os_info["ID"] << std::endl;
    std::cout << "版本ID: " << os_info["VERSION_ID"] << std::endl;
    std::cout << "完整名称: " << os_info["PRETTY_NAME"] << std::endl;
    
    return 0;
}

代码说明与注意事项

代码中的trim函数用于处理行首尾的空白字符,避免解析出错;remove_quotes函数用来去除值两侧的双引号,因为部分发行版的值会带引号,部分不会,统一处理后更方便使用。

需要注意如果程序运行在非Linux系统,或者系统没有/etc/os-release文件(比如非常老旧的发行版),文件打开会失败,实际使用时可以根据需求添加对应的兼容逻辑。另外如果某些字段不存在,访问os_info的对应键会返回空字符串,也可以提前判断键是否存在再输出。

c++Linuxos-release系统信息获取修改时间:2026-07-19 08:51:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。