我目前正在用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。
以上就是c/c++开发分享C,运行时测试,如果PATH中存在可执行文件相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/541715.html