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

时间:2011-11-07 10:47:25

标签: c path runtime

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

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

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

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

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

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

我应该用一个函数来搜索可执行文件吗?或者我真的需要继续进行并对其进行长期编码。

3 个答案:

答案 0 :(得分:3)

某些系统(FreeBSD,Linux)支持which命令,该命令在用户的路径中搜索给定命令。

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

答案 1 :(得分:1)

  

希望通常便携

对于POSIX平台,我想? execlp远非普遍可用。

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

答案 2 :(得分:0)

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