簡體   English   中英

通過C++判斷Linux中是否安裝了程序

[英]Determine via C++ whether a program is installed in Linux

我想從我的 C++ 代碼中對 Linux 程序進行system調用,但我想先檢查該程序是否安裝在用戶的機器上。

在 Ubuntu 中,我可以確定是否使用dpkg -s gifsicle之類的系統調用安裝了與該程序關聯的 package 並解析其 Z78E6221F6393D1356681CEDB398F1。 這里的gifsicle是程序名稱。

但是,該程序(例如gifsicle )可能是從源代碼編譯的,因此不會出現在 Ubuntu package 存儲庫中。

確定程序(例如gifsicle )在執行 C++ 代碼的系統上是否可用的一種好的編程方式是什么?

你可以先調用which

退出狀態指示它是否可以在路徑上找到指定的可執行文件。

Linux 沒有標准的 package 管理器,所以dpkg絕對是錯誤的答案。

出於安全和正確性的原因,依靠用戶的 PATH 來定位可執行文件可能是不明智的。 因此,您可能應該已經在調用system時使用了完全限定的路徑(例如/usr/bin/gifsicle )。

如果是這樣,您的問題的簡單答案是:

if (access("/usr/bin/gifsicle", X_OK) == 0) {
    system("/usr/bin/gifsicle -my -args");
}
else if (errno == EACCESS) {
    /* gifsicle not found */
}
else {
    /* access() failed!  Operating system is broken or Windows (or both) */
}

(如果您將/usr/bin/gifsicle放入變量中,則可以加分)

更難 - 但可以說“更正確” - 答案是避免system並自己執行fork + execl ,檢查execl以查看它是否導致ENOENT或類似的結果。 但是,將故障傳達回父進程可能會很煩人。

基本上,要涵蓋手動安裝程序並且未在已安裝軟件包數據庫中注冊的情況,您必須掃描整個文件系統以確保未安裝該程序。

如果您確定程序在用戶的 PATH 中,您可以調用which命令(也使用system() )。

但是,對此的常見解決方案是允許用戶通過配置選項覆蓋可執行文件的路徑。 例如,可以將Doxygen配置為調用dot來生成圖表。 默認情況下,它會嘗試在 PATH 環境變量中調用dot 如果找不到,它會警告用戶它找不到dot程序並且沒有設置DOT_PATH配置值。 該解決方案的優點是簡單並且也適用於其他系統。

正如您所說,確定是否安裝了某些東西並非易事。 確實,“已安裝”並沒有明確的定義; package 管理器接近,但並非一切都通過 package 管理器。

為什么不嘗試調用可執行文件? 如果調用失敗,並且system指示找不到可執行文件,那么就假設它沒有安裝和/或不可用——這有關系嗎? - 並繼續使用一些后備替代方案。

聽起來您正在嘗試制作配置腳本(或類似腳本)

見自動配置

http://www.linuxselfhelp.com/gnu/autoconf/html_chapter/autoconf_3.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM