[英]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
或類似的結果。 但是,將故障傳達回父進程可能會很煩人。
正如您所說,確定是否安裝了某些東西並非易事。 確實,“已安裝”並沒有明確的定義; package 管理器接近,但並非一切都通過 package 管理器。
為什么不嘗試調用可執行文件? 如果調用失敗,並且system
指示找不到可執行文件,那么就假設它沒有安裝和/或不可用——這有關系嗎? - 並繼續使用一些后備替代方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.