通过C确定程序是否安装在Linux中
作者:互联网
我想从我的C代码系统调用Linux程序,但我想检查程序是否先安装在用户的机器上.
在Ubuntu中,我可以确定是否使用dpkg -s gifsicle等系统调用安装了与该程序关联的包,并解析其输出.这里是gifsicle
的程序名称.
但是,程序(例如gifsicle)可能是从源代码编译的,因此不会出现在Ubuntu软件包库中.
什么是确定程序(例如gifsicle)在执行C代码的系统上是否可用的良好编程方法?
解决方法:
Linux没有标准的包管理器,所以dpkg肯定是错误的答案.
出于安全性和正确性的原因,依靠用户的PATH来定位可执行文件可能是不明智的.因此,您可能已经在调用系统时使用了完全限定的路径(例如/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放入一个变量,可以获得奖励积分)
更难 – 但可以说是“更正确” – 答案是避免系统并自己执行fork execl,检查execl以查看它是否导致ENOENT或类似.但是,将故障传递回父进程可能很烦人.
标签:c-2,repository,linux,system,package-managers 来源: https://codeday.me/bug/20190621/1253574.html