C语言使用uname()系统调用获取uname -o对应操作系统名问题咨询
实现方案
方案1:参考GNU uname的硬编码逻辑
GNU coreutils中的uname命令的-o选项属于GNU扩展,并未纳入POSIX标准,该选项的输出不依赖uname()系统调用,是编译coreutils时针对目标操作系统预设的固定值,Linux平台下默认就是GNU/Linux。
你可以直接在代码中添加简单判断:如果uname()返回的utsname.sysname为Linux,直接补充输出GNU/Linux即可,这是性能最高、实现最简单的方案。
方案2:调用系统uname命令读取输出
如果需要和当前系统的uname -o输出完全一致,不需要自己维护判断逻辑,可以通过管道调用命令并读取输出,示例代码如下:
#include <stdio.h> #include <string.h> char* get_operating_system(char* buf, size_t buf_len) { FILE* fp = popen("uname -o", "r"); if (!fp) return NULL; if (!fgets(buf, buf_len, fp)) { pclose(fp); return NULL; } // 去除输出末尾的换行符 size_t len = strlen(buf); if (len > 0 && buf[len-1] == '\n') buf[len-1] = '\0'; pclose(fp); return buf; } // 调用示例: // char os_name[256]; // if (get_operating_system(os_name, sizeof(os_name))) { // printf("操作系统:%s\n", os_name); // }
方案3:解析/etc/os-release文件
如果需要更详细的操作系统信息(比如具体发行版名称、版本号),可以解析标准的/etc/os-release文件,该文件在所有主流Linux发行版中都存在,包含NAME、PRETTY_NAME、ID等字段,你可以根据需求读取对应字段的值。
内容的提问来源于stack exchange,提问作者TheKraken
相关产品推荐
相关产品推荐

