我一直在玩弄,在C中编写一个小型IRC框架,我现在将扩展其中一些核心function – 但除此之外,我希望它可以通过插件进行扩展!
到目前为止,每当我写一些IRC相关的东西(我写了很多东西,现在大约有6种不同的语言……我很着火!)并且实际上继续实现了一个插件架构,它是在一种解释性的语言中有设施(读:滥用)所以,就像在Ruby中干扰整个脚本文件一样(糟糕!)。
现在我想在C中滥用一些东西!
基本上我可以做三件事
我喜欢第三个,如果可能的话,请避开其他两个选项。 也许我是某种forms的受虐狂,但我认为这对于学习目的来说既有趣又有用。
逻辑思考,明显的“痛苦链”将是(从最低到最高)2 – > 1 – > 3,原因很简单,因为libdl正在处理原始代码,这些代码可能(并且将会)在我的脸上爆炸。
所以这个问题告诉你,stackoverflow的其他用户,你认为libdl能胜任这个任务,甚至是一个现实的想法吗?
libdl
非常适合插件架构 – 在某些边界内:-)。 它在很多不同的软件中用于这种目的很多。 它适用于主程序和插件之间有明确定义的API /接口的情况,并且许多不同的插件实现相同的API /接口。 例如,您的IRC客户端可能具有实现不同IM协议(Jabber,MSN,Sametime等)的网关的插件 – 所有这些都非常相似,因此您可以使用诸如“发送消息”之类的function来定义API “,”检查回复“等 – 并编写一堆插件,每个插件都实现了不同的协议。
它运行得不好的情况是你想让插件对主程序的行为进行任意改变 – 例如,Firefox插件可以改变浏览器标签的行为,它们的外观,添加/删除按钮等。 这种事情在动态语言中更容易实现(因此,为什么很多Firefox都是用javascript实现的),如果这是你想要的那种自定义,你可能会更好地使用你的选项(2),并编写一个脚本语言中的很多用户界面……
dlopen()
/ dlsym()
可能是最简单的方法。 一些愚蠢的伪代码:
int run_module(const char *path, char **args) { void *module; void (*initfunc)(char **agrs); int rc = 0; module = dlopen(path, RTLD_NOW); if (module == NULL) err_out("Could not open module %s", path); initfunc = dlsym(module, "module_init"); if (initfunc == NULL) { dlclose(module); err_out("Could not find symbol init_func in %s", path); } rc = initfunc(args); dlclose(module); return rc; }
当然,你会想要更多的错误检查,以及实际做了一些有用的代码:)然而,在这对中编写一个插件架构并发布一个简单的规范是非常容易和方便的其他人也这样做。
你可能想要更多load_module()
,上面只是加载SO,寻找一个入口点并阻塞直到该入口点退出。
这并不是说编写自己的脚本语言是个坏主意。 人们可以编写复杂的filter,响应者等,而不必经历很多麻烦。 也许两者都是个好主意。 我不知道你是否想要一个完整的LUA解释器……也许你可以想出一些基于正则表达式采取简单操作的东西。
尽管如此,插入模块不仅可以让您的生活更简单,它们还可以帮助您建立一个人们社区,围绕您制作的任何东西开发。
有很多现有的C程序使用dlopen()
/ dlsym()
来实现插件架构(包括多个与IRC相关的架构); 是的,这绝对取决于任务。
以上就是c/c++开发分享使用libdl在C中的插件架构相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562201.html