C ++ получить имя дистрибутива Linux \ версия - PullRequest
8 голосов
/ 11 июня 2011

В соответствии с вопросом " Как получить имя и версию дистрибутива Linux? ", чтобы получить имя и версию дистрибутива Linux, это работает:

lsb_release -a

В моей системе,он показывает необходимый вывод:

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

Теперь, чтобы получить эту информацию в C ++, QProcess Qt4 был бы отличным вариантом, но так как я занимаюсь разработкой без Qt с использованием std c ++, мне нужно знать, как получить этоинформация в стандартном C ++, то есть стандартный вывод процесса, а также способ анализа информации.

До сих пор я пытаюсь использовать код из здесь , но застрял в функции прочитать ().

Ответы [ 5 ]

20 голосов
/ 11 июня 2011

Вы можете просто использовать функцию:

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

Я что-то упустил?

1 голос
/ 11 марта 2018

Для последних дистрибутивов 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"
1 голос
/ 11 июня 2011
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]
}

у меня работает

0 голосов
/ 11 июня 2011

Получено с форумов 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;
}
0 голосов
/ 11 июня 2011

Существуют файлы с именами / etc / version и / etc / release , в которых есть информация, например, используете ли вы Ubuntu или Fedora и т. Д. (Что пояснил OP его вопрос будет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...