繁体   English   中英

C++ 获取 linux 发行版名称\版本

[英]C++ get linux distribution name\version

根据问题“ 如何获取 Linux 发行版名称和版本? ”,要获取 linux 发行版名称和版本,此方法有效:

lsb_release -a

在我的系统上,它显示了所需的 output:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 9.10
Release:    9.10
Codename:   karmic

Now, to get this info in C++, Qt4's QProcess would be a great option but since I am developing without Qt using std c++, I need to know how to get this info in standard C++, ie the stdout of the process, and also a解析信息的方法。

到目前为止,我正在尝试使用此处的代码,但被困在 function读取()上。

您可以简单地使用 function:

int uname(struct utsname *buf);

通过包括 header

#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
   };

我错过了什么吗?

对于最近的 linux 发行版,您可以使用以下内容获取操作系统信息。 output 非常标准,可以使用以下规范进行解析:

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"

从 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;
}
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 澄清他的问题的内容)。

我个人喜欢@Alok Slav 发布的 uname 解决方案,但如果它可以帮助需要使用命令行实用程序获取信息的人,请考虑使用popen

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM