Linux系统有限的插件架构?

时间:2012-07-11 16:42:46

标签: c++ linux plugins

我想为Linux编写一个插件架构。我已经尝试过研究如何做到这一点,但实际上我一直在寻找更复杂的插件架构的信息然后我需要的东西,我只想要一个非常基本的实现。

为了解释我正在做什么,我有一个接受和处理来自各种来源的输入的程序,同一程序的多个实例可能会在每个实例接受不同的输入源的情况下运行。我想做一些级别的错误检查和纠正,但这种错误检查的逻辑将根据输入源而变化。所以我希望我的程序为它正在读取的特定源打开一个插件(插件名称可能在配置文件中)并运行库提供的错误检查方法。这比我在插件中看到的大多数架构和信息更基本,因为

  • 这不是跨平台的。我知道我将使用x86 linux平台,甚至可以在必要时定义一个精确的编译器
  • '插件'非常基础,可能与每个插件提供的单个方法一样少。

然而,我必须有两件事

1)必须。我将以高容量阅读流数据并需要快速处理。出于这个原因,我已经删除了脚本代理的使用,我担心为每个输入翻译脚本逻辑的开销可能很大

2)我必须能够检测到现有.SO的更新,并在不停止程序的情况下加载新版本。

一般来说,我对c ++还是半新手,所以对尝试开发太复杂的东西感到有点担心。我正在寻找最简单可行的解决方案。

我考虑过Boost.Extension,但它实际上可能对我需要的东西有点过分。我试图决定是否更好地手动定义.SO而不是尝试使用Boost框架,因为我的用例非常简单。在我工作的地方使用Boost也有一些小麻烦,我可以做到,但我必须通过一些箍来获得许可。

所以任何人都可以告诉我 1)插件架构真的是我应该在这里尝试的(有更简单的解决方案吗?) 2)如果他们认为Boost.Extensions是最好的方法 3)可以指出任何描述如何制作平台特定的插件架构的文档(我已经看到很多关于平台独立的讨论,但我不需要做任何复杂的事情)。 4)确保在运行时加载新版本库的最佳方法是什么?因为早先声明需要快速处理,每次我接受输入时都会避免使用if语句。

1 个答案:

答案 0 :(得分:6)

1)是的。在您的情况下,这是一个简单的解决方案。 Linux有一个传统上简单的API,编写/使用共享库通常很简单(有一些注意事项,见下文)。

2)由于您的目标是Linux,因此不需要独立于平台的抽象。平台独立的共享库管理充满了血腥的细节,在这里你不关心这一点。与仅使用Linux的解决方案相比,Boost Extensions可能不那么简单。

3)使用dlopendlsym C函数(即了解extern "C"并事先命名修改)。有很多关于C ++和dlsym / dlopen的教程(如this one)。基本上,你的界面越简单越好(最好是几个C函数,没有类)。

4)您可以查看inotify,它是文件系统事件通知的Linux标准。为每个已加载的库添加一个监视,您将收到处理程序的任何更改通知。处理程序应该只为主循环设置一个标志,以便在需要时重新加载库。