我想从我的C++代码对一个Linux程序进行system调用,但是我想先检查一下这个程序是否安装在用户的机器上。
在Ubuntu中,我可以确定是否使用dpkg -s gifsicle等系统调用安装了与该程序相关的包,并解析其输出。gifsicle这里是程序名。
然而,也有可能程序(例如gifsicle)是从源代码编译而来的,因此不会出现在Ubuntu包存储库中。
在执行C++代码的系统上,确定程序(例如gifsicle)是否可用的好的编程方法是什么?
发布于 2011-08-13 04:48:54
没有针对Linux的标准包管理器,所以dpkg绝对是错误的答案。
出于安全性和正确性的原因,依靠用户的路径来定位可执行文件可能是不明智的。因此,您可能已经在调用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或类似的结果。不过,将故障传回父进程可能会很烦人。
发布于 2011-08-13 04:22:56
您可以先调用which。
退出状态指示它是否可以在路径上找到指定的可执行文件。
发布于 2011-08-13 04:27:42
基本上,为了涵盖手动安装程序且未在已安装程序包数据库中注册的情况,您必须扫描整个文件系统以确保程序未安装。
如果您确定程序位于用户的路径中,则可以调用which命令(也可以使用system())。
但是,常见的解决方案是允许用户通过配置选项覆盖可执行文件的路径。例如,可以将Doxygen配置为调用dot来生成图表。默认情况下,它尝试调用PATH环境变量上的dot。如果找不到,它会警告用户找不到dot程序,并且尚未设置DOT_PATH配置值。这种解决方案的优点是简单,也可以在其他系统上工作。
https://stackoverflow.com/questions/7045879
复制相似问题