繁体   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