我目前正在用 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
可用。 ;-) 如果这是一个问题,您可能仍然需要考虑将该功能构建到您的程序中,但代码仍然可能是一个有用的起点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)