C++ get linux distribution name\version

后端 未结 6 1602
悲哀的现实
悲哀的现实 2021-01-12 06:10

According to the question \" How to get Linux distribution name and version? \", to get the linux distro name and version, this works:

lsb_release -a
         


        
相关标签:
6条回答
  • 2021-01-12 06:47

    Got it from cplusplus.com forums, a simple call GetSystemOutput("/usr/bin/lsb_release -a") works.

    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;
    }
    
    0 讨论(0)
  • 2021-01-12 06:48

    There are files named /etc/version and /etc/release which have information like whether you're using Ubuntu or Fedora, etc. (which is what the OP clarified his question to be).

    0 讨论(0)
  • 2021-01-12 06:50

    Personally I like the uname solution posted by @Alok Slav, but in case it helps someone who needs to use a command-line utility to get the info, consider using popen.

    0 讨论(0)
  • 2021-01-12 06:51

    You can simply use the function:

    int uname(struct utsname *buf);
    

    by including the header

    #include <sys/utsname.h>
    

    It already returns the name & version as a part of the structure:

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

    Am I missing something?

    0 讨论(0)
  • 2021-01-12 07:00
    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]
    }
    

    It works for me

    0 讨论(0)
  • 2021-01-12 07:08

    For recent linux distros you can use following to get the OS info. The output is pretty standard and can be parsed using following spec:

    https://www.freedesktop.org/software/systemd/man/os-release.html

    cat /etc/os-release
    

    Sample outputs:

    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"
    
    0 讨论(0)
提交回复
热议问题