我想为Linux编写一个插件架构.我已经尝试过研究如何做到这一点,但实际上我一直在寻找更复杂的插件架构的信息然后我需要的东西,我只想要一个非常基本的实现.
为了解释我正在做什么,我有一个程序接受和处理来自各种来源的输入,同一程序的多个实例可能会运行,每个实例接受不同的输入源.我想做一些级别的错误检查和纠正,但这种错误检查的逻辑将根据输入源而变化.所以我希望我的程序为它正在读取的特定源打开一个插件(插件名称可能在配置文件中)并运行库提供的错误检查方法.这比我在插件中看到的大多数架构和信息更基本,因为
但是,我必须有两件事
1)一定要快.我将以高容量阅读流数据并需要快速处理.出于这个原因,我已经删除了脚本代理的使用,我担心为每个输入翻译脚本逻辑的开销可能很大
2)我必须能够检测到现有.SO的更新并加载新版本而不停止程序.
一般来说,我对c ++还是半新手,所以对尝试开发太复杂的东西感到有点担心.我想确定最简单可行的解决方案对我来说是什么.
我考虑过Boost.Extension,但它实际上可能对我需要的东西有点过分.我试图决定是否更好地手动定义.SO而不是尝试使用Boost框架,因为我的用例非常简单.在我工作的地方使用Boost也有一些小问题,我可以做到,但是我必须通过一些箍来获得许可.
所以任何人都可以告诉我1)插件架构是否真的应该在这里尝试(有更简单的解决方案吗?)2)如果他们认为Boost.Extensions是最好的方法3)可以指向我描述如何的任何文件制作一个特定于平台的插件架构(我见过很多关于平台独立的讨论,但我不需要做任何复杂的事情).4)确保在运行时加载新版本库的最佳方法是什么?因为早先声明的快速处理需要,每次我接受输入时都避免使用if语句.
1)是的.在您的情况下,这是一个简单的解决方案.Linux有一个传统上简单的API,编写/使用共享库通常很简单(有一些注意事项,见下文).
2)由于您的目标是Linux,因此不需要独立于平台的抽象.平台独立的共享库管理充满了血腥的细节,在这里你不关心这一点.Boost Extensions可能不如仅使用Linux的解决方案简单.
3)使用dlopen和dlsym使用C函数(即extern "C"预先了解和命名修改).有很多关于C++和dlsym/dlopen的教程(就像这一篇).基本上,你的界面越简单越好(最好的是几个C函数,没有类).
4)您可以查看一下inotify,这是文件系统事件通知的Linux标准.为每个已加载的库添加一个监视,您将收到处理程序的任何更改通知.处理程序应该只为主循环设置一个标志,以便在需要时重新加载库.