根据问题“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 ++中获取此信息,即进程的标准输出,还有一种解析信息的方法。
答案 0 :(得分:19)
您只需使用以下功能:
int uname(struct utsname *buf);
包含标题
#include <sys/utsname.h>
它已经返回名称&amp;版本作为结构的一部分:
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
};
我错过了什么吗?
答案 1 :(得分:1)
int writepipe[2];
if (pipe(writepipe) < 0) {
perror("pipe");
return 1;
}
int ret = fork();
if (ret < 0) {
perror("fork");
return 1;
}
else if (ret == 0) // child process
{
dup2(writepipe[1],1); // set writepipe[1] as stdout
// close fds
close(writepipe[0]);
close(writepipe[1]);
execlp("lsb_release","lsb_release","-a",NULL); //TODO: Error checking
}
else // parent process
{
int status;
waitpid(ret,&status,0); //TODO: Error checking
//do what you need
//read output of lsb_release from writepipe[0]
}
它对我有用
答案 2 :(得分:0)
有些文件名为/ etc / version 和/ etc / release ,其中包含您是否使用Ubuntu或Fedora等信息(这是什么OP澄清了他的问题。)
答案 3 :(得分:0)
从cplusplus.com论坛得到它,一个简单的电话GetSystemOutput("/usr/bin/lsb_release -a")
就可以了。
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;
}
答案 4 :(得分:0)
对于最近的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"
答案 5 :(得分:0)
我个人喜欢@Alok Slav发布的一致解决方案,但是如果它可以帮助需要使用命令行实用程序来获取信息的人,请考虑使用popen。