C,运行时测试,如果PATH中存在可执行文件

我目前正在用C编写一个应用程序,目标是BSD和Linux系统,希望能够通用。 这个程序是运行时依赖,在本例中是mplayer。

目前我正在使用execlp()来启动mplayer。 我正在检查execlp调用的错误代码,我正在测试EACCESS ,所以我知道当我尝试运行mplayer时它是否存在。

由于我的程序工作方式,mplayer是必需的依赖项,但在我的程序启动后可能不会使用一段时间。 作为用户体验,由于mplayer丢失,程序在失败之前已经运行了一段时间是很差的。 所以我想在我的程序启动时测试mplayer的存在。 如果mplayer不可用,可能会发送错误消息。

现在我知道这里存在竞争条件,因此我当前对EACCESS错误的处理必须保持EACCESS 。 我们可以找到用户启动程序运行的情况,然后卸载mplayer。 这是被接受的。

我最初的想法是在执行的早期调用execlp() ,但这会导致mplayer明显启动。 说实话,我宁愿不要启动mplayer,只是测试我是否“可以”启动它(例如,在我的路径中某个地方存在一个名为mplayer的文件并且它是可执行的)。

然后再考虑运行这些精确步骤,查看路径并测试匹配文件是否可执行。 我还没有对此进行编码有两个原因。 第一个原因,确保execlp是找到我发现的相同的东西,我必须将发现的路径名传递给execlp,绕过内置的PATH搜索机制。 另一个原因就是我觉得我错过了一个明显的伎俩。

是否有我应该用来搜索可执行文件的函数? 或者我真的需要继续进行并对其进行编码。

某些系统(FreeBSD,Linux)支持使用which命令搜索用户的路径以获取给定命令。

我认为从某种意义上说问题就是问题……如果你的代码可能在各种系统上运行,你可能觉得有必要做which which只是为了确定which是可用的。 ;-)如果这是一个问题,你可能仍然需要考虑在你的程序中构建该function,但代码仍然是一个有用的起点。

希望通常是便携式的

我认为对于POSIX平台? execlp远非普遍可用。

除了尝试执行命令之外,没有可移植的方法来检查命令的可用性。 你可以做的是从BSD execlp (用户区部分)或BSD的which命令复制路径查找逻辑。

在ANSI C中没有特定的方法。您可以尝试fopen()并检查返回码。 尝试使用stat调用(man 2 stat),它存在于Linux上,但我不确定BSD。