首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C++判断程序是否安装在Linux中。

通过C++判断程序是否安装在Linux中。
EN

Stack Overflow用户
提问于 2011-08-13 04:21:29
回答 5查看 2.5K关注 0票数 4

我想从我的C++代码对一个Linux程序进行system调用,但是我想先检查一下这个程序是否安装在用户的机器上。

在Ubuntu中,我可以确定是否使用dpkg -s gifsicle等系统调用安装了与该程序相关的包,并解析其输出。gifsicle这里是程序名。

然而,也有可能程序(例如gifsicle)是从源代码编译而来的,因此不会出现在Ubuntu包存储库中。

在执行C++代码的系统上,确定程序(例如gifsicle)是否可用的好的编程方法是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-13 04:48:54

没有针对Linux的标准包管理器,所以dpkg绝对是错误的答案。

出于安全性和正确性的原因,依靠用户的路径来定位可执行文件可能是不明智的。因此,您可能已经在调用system时使用了完全限定路径(例如/usr/bin/gifsicle)。

如果是这样,你的问题的简单答案是:

代码语言:javascript
复制
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或类似的结果。不过,将故障传回父进程可能会很烦人。

票数 2
EN

Stack Overflow用户

发布于 2011-08-13 04:22:56

您可以先调用which

退出状态指示它是否可以在路径上找到指定的可执行文件。

票数 4
EN

Stack Overflow用户

发布于 2011-08-13 04:27:42

基本上,为了涵盖手动安装程序且未在已安装程序包数据库中注册的情况,您必须扫描整个文件系统以确保程序未安装。

如果您确定程序位于用户的路径中,则可以调用which命令(也可以使用system())。

但是,常见的解决方案是允许用户通过配置选项覆盖可执行文件的路径。例如,可以将Doxygen配置为调用dot来生成图表。默认情况下,它尝试调用PATH环境变量上的dot。如果找不到,它会警告用户找不到dot程序,并且尚未设置DOT_PATH配置值。这种解决方案的优点是简单,也可以在其他系统上工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7045879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档