2009-01-02 38 views

回答

1

這是低效的(需要分叉和執行/bin/sh)。一定有更好的方法!但作爲一種通用的方法......系統總是有()

(記住使用WEXITSTATUS()!當心使程序不間斷!)

#define SHOW(X) cout << # X " = " << (X) << endl 

int main() 
{ 
    int status; 

    SHOW(status = system("which grep > /dev/null 2>&1")); 
    SHOW(WEXITSTATUS(status)); 

    SHOW(status = system("which no_matching_file > /dev/null 2>&1")); 
    SHOW(WEXITSTATUS(status)); 
} 

還有POPEN(),它可以從程序來驗證版本搶奪輸出有用數字,圖書館或什麼。

如果您需要雙向(讀&寫)訪問子,最好使用管()fork()的EXEC()接近(),& DUP2()

1

可以要求他們在路徑等。檢查可執行文件,你需要(使用which或類似)的存在。如果需要,您還可以使用可執行文件的參數並檢查所需的版本。

1

我不知道的方式做到這一點對於一般的Linux,因爲每個發行版都可以有自己的包管理器。但是假設你想支持最受歡迎的發行版,你可以查詢他們的軟件包管理器以獲得已安裝的軟件(我建議作爲開始支持apt-get,rpm和yum)並解析輸出以查找你認識的軟件包。每個經理有辦法列出已安裝的軟件包,我的建議是一個開始:

apt-get --no-act check 
rpm -qa 
yum list installed 
+0

有一個警告:如果用戶安裝了一些不使用相應的軟件包管理器(使用make直接安裝),你不會發現它。 – 2009-01-02 15:17:20

0

另外一個可能性是存在的所有功能給用戶,提示他們,如果他們試圖用它們來安裝額外(如見http://0install.net)。

相關問題