系统相关
首页 > 系统相关> > 通过C确定程序是否安装在Linux中

通过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