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

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

由于我的程序的工作方式,mplayer 是必需的依赖项,但在我的程序启动后的一段时间内可能无法使用。作为用户体验,由于缺少 mplayer,程序在失败之前已经运行了一段时间是很糟糕的。所以我想在我的程序启动时测试现有的 mplayer。如果 mplayer 不可用,可能会传递错误消息。

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

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

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

是否有我应该使用的函数来搜索可执行文件?或者我真的需要继续下去并编码它很长的路要走。

最佳答案

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

我想这在某种意义上引出了问题……如果您的代码可能在各种系统上运行,您可能会觉得需要执行 which which 来确定 which 是否可用。 ;-) 如果这是一个问题,您可能仍然需要考虑将该功能构建到您的程序中,但代码仍然可能是一个有用的起点。

关于C、运行时测试PATH中是否存在可执行文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8035372/

10-11 21:16