根据问题“How to get Linux distribution name and version? ",要获得linux发行版的名称和版本,这是可行的:
lsb_release -a
在我的系统上,它显示了所需的输出:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 9.10
Release: 9.10
Codename: karmic
现在,要在C++中获取这些信息,qt4的QProcess将是一个很好的选择,但由于我使用std c++在没有Qt的情况下进行开发,我需要知道如何在标准C++中获取这些信息,即进程的标准输出,以及一种解析信息的方法。
发布于 2011-06-11 12:51:27
这是从cplusplus.com论坛上获得的,一个简单的调用GetSystemOutput("/usr/bin/lsb_release -a")
works。
char* GetSystemOutput(char* cmd){
int buff_size = 32;
char* buff = new char[buff_size];
char* ret = NULL;
string str = "";
int fd[2];
int old_fd[3];
pipe(fd);
old_fd[0] = dup(STDIN_FILENO);
old_fd[1] = dup(STDOUT_FILENO);
old_fd[2] = dup(STDERR_FILENO);
int pid = fork();
switch(pid){
case 0:
close(fd[0]);
close(STDOUT_FILENO);
close(STDERR_FILENO);
dup2(fd[1], STDOUT_FILENO);
dup2(fd[1], STDERR_FILENO);
system(cmd);
//execlp((const char*)cmd, cmd,0);
close (fd[1]);
exit(0);
break;
case -1:
cerr << "GetSystemOutput/fork() error\n" << endl;
exit(1);
default:
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
int rc = 1;
while (rc > 0){
rc = read(fd[0], buff, buff_size);
str.append(buff, rc);
//memset(buff, 0, buff_size);
}
ret = new char [strlen((char*)str.c_str())];
strcpy(ret, (char*)str.c_str());
waitpid(pid, NULL, 0);
close(fd[0]);
}
dup2(STDIN_FILENO, old_fd[0]);
dup2(STDOUT_FILENO, old_fd[1]);
dup2(STDERR_FILENO, old_fd[2]);
return ret;
}
发布于 2011-06-11 11:53:13
您可以简单地使用以下函数:
int uname(struct utsname *buf);
通过包含标头
#include <sys/utsname.h>
它已经将名称和版本作为结构的一部分返回:
struct utsname
{
char sysname[]; /* Operating system name (e.g., "Linux") */
char nodename[]; /* Name within "some implementation-defined network" */
char release[]; /* OS release (e.g., "2.6.28") */
char version[]; /* OS version */
char machine[]; /* Hardware identifier */
#ifdef _GNU_SOURCE
char domainname[]; /* NIS or YP domain name */
#endif
};
我是不是遗漏了什么?
发布于 2018-03-11 06:38:54
对于最新的linux发行版,您可以使用以下命令获取操作系统信息。输出是非常标准的,可以使用以下规范进行解析:
https://www.freedesktop.org/software/systemd/man/os-release.html
cat /etc/os-release
示例输出:
NAME=Fedora
VERSION="27 (Twenty Seven)"
ID=fedora
VERSION_ID=27
PRETTY_NAME="Fedora 27 (Twenty Seven)"
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
ID_LIKE=archlinux
ANSI_COLOR="0;36"
https://stackoverflow.com/questions/6315666
复制相似问题