2011-06-11 45 views
7

按照問題「How to get Linux distribution name and version?」,獲得Linux發行版的名稱和版本,這個工程:C++得到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++中獲得這些信息,即進程的stdout ,也是解析信息的一種方式。

Uptil now我試圖使用來自here的代碼,但是卡在函數read()中。通過包括頭

#include <sys/utsname.h> 

它已經返回名稱&版本作爲結構的一部分

int uname(struct utsname *buf); 

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

+0

?從C++開始外部過程?閱讀其輸出? ...請更具體,並顯示你到目前爲止。 – Mat 2011-06-11 11:41:33

+0

更新........... – yolo 2011-06-11 12:02:42

+0

找到答案http://stackoverflow.com/questions/6315666/c-get-linux-distribution-name-version/6316023#6316023 – yolo 2011-06-11 12:56:25

回答

0

從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; 
} 
+1

這一半時間不起作用,它只是掛起。任何想法爲什麼?另外,因爲你永遠不會釋放內存泄漏,所以不會「內存泄漏」? – leetNightshade 2012-08-02 22:53:11

16

你可以簡單的使用功能我錯過了什麼嗎?

+4

其實這已經實現。我需要知道分發名稱和版本,例如「Ubuntu的」或「Fedora的」等 – yolo 2011-06-11 11:59:45

+0

由於我的程序只在Ubuntu系統上運行,得到的答案與此一合併幫助我: http://askubuntu.com/a/517140/17800 – Stoffisimo 2016-10-12 13:01:00

0

有命名文件/ etc/和/ etc/發佈其中有像您是否使用Ubuntu或Fedora等(這是什麼OP澄清了他的問題所在)的信息。

+0

我使用Ubuntu 12 ,而這些文件不存在。所以如果它不是Linux的便攜式解決方案,這看起來不是一個好的選擇。 – leetNightshade 2013-01-11 17:48:45

+2

我發現'/ etc/lsb-release'和'/ etc/debian_version',有趣的是。我會將其添加到答案中。 – icedwater 2014-02-27 03:10:25

1
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] 
} 

它爲您遇到的麻煩是什麼我

+1

你如何從writepipe中讀取lsb_release的輸出?編程管是一個非常小的緩衝區,如果你的意思是寫信並從中獲得回報,你就不會認真。 – leetNightshade 2013-01-11 17:50:25