Linux系统的有限插件体系结构



我想为Linux编写一个插件体系结构。我试着研究如何做到这一点,但实际上我一直在寻找比我需要的更复杂的插件架构的信息,我只想要一个非常基本的实现。

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

  • 它不是跨平台的。我知道我将使用x86Linux平台,如果需要,甚至可以定义一个精确的编译器
  • "插件"是非常基本的,它可能只有每个插件提供的一个方法那么小

然而,有两件事我必须有

1) 它必须。我将以高容量读取流式数据,需要快速处理。正是因为这个原因,我已经取消了脚本代理的使用,我担心为每个输入翻译脚本逻辑的开销可能会达到很好的

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

一般来说,我对c++还不太熟悉,所以我对开发任何过于复杂的东西有点担心。我想确定什么是对我来说最简单可行的解决方案

我已经考虑过Boost.Extension,但实际上它可能对我的需求来说有些过头了。由于我的用例非常简单,我正试图决定是否最好只手动定义.SO,而不是尝试使用Boost框架。在我工作的地方使用Boost也有一些小问题,我可以做到,但我必须跳过一些障碍才能获得许可。

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

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

2) 既然您的目标是Linux,就不需要独立于平台的抽象。独立于平台的共享库管理充满了血腥的细节,在这里你并不关心这一点。Boost扩展可能不如纯linux解决方案简单。

3) 将dlopendlsymC函数一起使用(即,事先了解extern "C"和名称篡改)。有很多关于C++和dlsym/dllopen的教程(比如这个)。基本上,你的接口越简单越好(最好是几个C函数,没有类)。

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

最新更新