[英]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.