问题描述
|
根据问题“如何获取Linux发行版名称和版本?”,获得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 ++中获取此信息,即过程的标准输出,以及解析信息的方法。
直到现在,我一直尝试从此处使用代码,但仍停留在read()函数上。
解决方法
您可以简单地使用以下功能:
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
};
我想念什么吗?
, 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]
}
这个对我有用
, 对于最新的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\"
, 有名为/ etc / version和/ etc / release的文件,其中包含诸如您使用的是Ubuntu还是Fedora等信息(OP澄清了他的问题)。
, 在cplusplus.com论坛上找到它,一个简单的呼叫ѭ8即可使用。
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,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;
}
, 我个人喜欢@Alok Slav发布的一致解决方案,但是如果它可以帮助需要使用命令行实用程序来获取信息的人,请考虑使用popen。