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

了解/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