3

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

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

  • 它不是跨平台的。我知道我将使用 x86 linux 平台,如果需要,甚至可以定义一个精确的编译器
  • “插件”是非常基础的,它可以是每个插件提供的单一方法。

但是,有两件事我必须拥有

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

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

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

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

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

4

1 回答 1

6

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

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

3) 使用dlopenanddlsymC 函数extern "C"一起使用(即事先了解和命名修饰)。有很多关于 C++ 和 dlsym/dlopen 的教程(比如这个)。基本上,您的界面越简单越好(最好是一些 C 函数并且没有类)。

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

于 2012-07-11T16:57:20.380 回答