首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用libdl的C语言插件体系结构

使用libdl的C语言插件体系结构
EN

Stack Overflow用户
提问于 2010-05-21 14:09:29
回答 3查看 6.3K关注 0票数 6

我一直在玩,用C编写了一个小的IRC框架,现在我要用一些核心功能来扩展它--但除此之外,我希望它可以用插件进行扩展!

直到现在,每当我写一些IRC相关的东西(我写了很多,现在用6种不同的语言.我着火了!)实际上,它实现了一个插件体系结构,它是在一种解释语言中实现的(读:滥用),所以,就像用Ruby中的eval阻塞整个脚本文件一样(糟糕!)

现在我想滥用C中的东西!

基本上我可以做三件事

  1. 在我的程序
  2. 中定义了一个简单的脚本语言,使用现有的脚本语言,嵌入解释器
  3. 使用libdl在运行时

上加载*.so模块。

我喜欢第三种选择,如果可能的话,尽量避免其他两种选择。也许我是某种受虐狂,但我认为这既有趣又有益于学习的目的。

从逻辑上说,显而易见的“痛苦链”将是(从最低到最高)2 -> 1 -> 3,原因很简单,libdl处理的原始代码可能(而且会)经常在我面前爆炸。

所以这个问题就交给你了,堆栈溢出的用户们,你认为libdl能胜任这个任务,甚至是一个现实的想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-21 14:19:46

libdl非常适合插件体系结构--在特定的边界内:-)。在许多不同的软件中,它正是为了这种目的而使用的。在主程序和插件之间有一个定义良好的API/接口的情况下,它工作得很好,并且许多不同的插件实现了相同的API/接口。例如,您的IRC客户端可能具有实现不同IM协议(Jabber、MSN、Sametime等)的网关的插件--所有这些都非常相似,因此您可以定义一个API,其功能包括“发送消息”、“检查应答”等,并编写一组插件,每个插件实现不同的协议之一。

不太好的情况是,您希望插件对主程序的行为进行任意更改--例如,Firefox插件可以改变浏览器选项卡的行为、外观、添加/删除按钮等。这类事情在动态语言中更容易实现(因此,火狐的大部分都是用javascript实现的),如果这是您想要的自定义,那么您最好选择(2),用脚本语言编写大量的UI .

票数 3
EN

Stack Overflow用户

发布于 2010-05-21 14:38:42

dlopen() / dlsym()可能是最简单的方法。一些愚蠢的psuedo代码:

代码语言:javascript
复制
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,寻找一个入口点并阻塞,直到该入口点退出。

这并不是说编写自己的脚本语言是个坏主意。人们可以写复杂的过滤器,响应等,而不必经历很多麻烦。也许两者都是个好主意。我不知道你是否想要一个成熟的LUA翻译。也许您可以想出一些方法,使基于正则表达式的操作变得简单。

即使如此,插入模块不仅会使你的生活变得更简单,还能帮助你成长一个社区,让人们围绕你所做的一切来开发自己的东西。

票数 3
EN

Stack Overflow用户

发布于 2010-05-21 14:13:59

有很多现有的C程序使用dlopen() / dlsym()来实现插件体系结构(包括多个与IRC相关的插件);因此,确实可以完成这项任务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2882771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档