C ++获取linux发行名称\\\\ version

问题描述

| 根据问题“如何获取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。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...