根据“ 如何获得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将是一个很好的select,但是因为我正在使用std c ++开发没有Qt,所以我需要知道如何在标准C ++中获得这个信息,也就是过程的标准输出parsing信息的方法。
Uptil现在我试图从这里使用代码,但是卡在函数read ()。
你可以简单地使用这个函数:
int uname(struct utsname *buf);
通过包含标题
#include <sys/utsname.h>
它已经作为结构的一部分返回了名称&版本:
struct utsname { char sysname[]; /* Operating system name (eg, "Linux") */ char nodename[]; /* Name within "some implementation-defined network" */ char release[]; /* OS release (eg, "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] }
这个对我有用
有一些名为/ etc / version和/ etc / release的文件 ,它们具有诸如使用Ubuntu或Fedora等信息(这是OP澄清了他的问题)。
从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; }