我目前正在用C编写一个应用程序,目标是BSD和Linux系统,希望能够通用移植。这个程序是一个运行时依赖,在本例中是mplayer。
目前我正在使用execlp()
启动mplayer。我正在检查execlp调用的错误代码,我正在测试EACCESS
,所以我知道当我尝试运行mplayer时它是否存在。
由于我的程序工作方式,mplayer是必需的依赖项,但在我的程序启动后可能不会使用一段时间。作为一种用户体验,由于mplayer丢失,程序在失败之前已经运行了一段时间。所以我想在我的程序启动时测试mplayer的存在。如果mplayer不可用,可能会发送错误消息。
现在我知道这里存在竞争条件,所以我当前对EACCESS
错误的处理必须保持不变。我们可以找到用户启动程序运行的情况,然后卸载mplayer。这是被接受的。
我最初的想法是在执行的早期调用execlp()
然后这会导致mplayer明显启动。老实说,我不想启动mplayer,只是测试我是否“可以”启动它(例如,我的路径中存在一个名为mplayer的文件并且是可执行的。)
然后再考虑运行这些精确步骤,查看路径并测试匹配文件是否可执行。我还没有对此进行编码有两个原因。第一个原因,确保execlp是找到我发现的相同的东西,我必须将发现的路径名传递给execlp,绕过内置的PATH搜索机制。另一个原因就是我觉得我错过了一个明显的伎俩。
我应该用一个函数来搜索可执行文件吗?或者我真的需要继续进行并对其进行长期编码。
答案 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。