Linux系统有限的插件架构?

dso*_*len 3 c++ linux plugins

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

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

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

但是,我必须有两件事

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

2)我必须能够检测到现有.SO的更新并加载新版本而不停止程序.

一般来说,我对c ++还是半新手,所以对尝试开发太复杂的东西感到有点担心.我想确定最简单可行的解决方案对我来说是什么.

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

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

Ale*_* C. 6

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

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

3)使用dlopendlsym使用C函数(即extern "C"预先了解和命名修改).有很多关于C++和dlsym/dlopen的教程(就像这一篇).基本上,你的界面越简单越好(最好的是几个C函数,没有类).

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