在不影响现有C或c++应用程序设计的情况下添加新的职责
Addition of new responsibilities without impacting existing design of a C or C++ application
我有组件负责接收消息和的需求处理消息。应该有一个通用的消息接口,如uint8
数组(它是一个二进制消息)和一个通用框架,从外部配置文件中读取,一个处理程序列表。处理程序应该实现一个通用接口,例如:-
uint8[] process(uint8[] message);
每个处理程序应该处理消息并将处理后的消息返回给框架,以便框架可以将处理后的消息传递给下一个处理程序,依此类推。这种方法的美妙之处在于,它允许通过在配置文件中添加新的处理程序来添加新的功能(希望是在运行时)。泛型框架应该初始化新的处理程序,将其放在相应的处理程序位置,并通过所有处理程序传递消息。
我已经在Java中多次实现了这种方法,但我正在努力在C和c++中实现它。例如,在C中,我想也许通过一个指向框架的函数指针来注册每个处理程序的进程函数,这样框架就可以将消息传递给每个处理程序。但我不知道如何初始化基于配置文件的处理程序。配置文件将包含处理程序的"字符串"名称。main方法如何将字符串名称映射到处理程序文件?
如果你的配置文件这样说:
handler1.so
handler2.so
handler3.so
如果你在Linux平台上,你可以这样做:
void *lib = dlopen(name, RTLD_NOW);
typedef uint8* (handler_t)(uint8*);
handler_t *func = (handler_t*)dlsym("handler");
表示配置文件中的每个名称。这将动态加载一个共享库,其中每个库都包含一个处理函数(名为"handler")。
对于其他操作系统,存在类似的功能(例如Windows上的LoadLibrary用于*.dll)。
对于C,您有两个选择。
一种是使用dlsym()
或其等效函数来查找与指定为字符串的函数名对应的函数指针。
另一种是使用预先确定的名称数组和相应的函数指针。如果接口不同(尽管dlsym()
也有问题),这会变得混乱。
struct func_name
{
const char *name;
uint8 (*function)(void);
};
static const struct func_name func_list[] =
{
{ "function1", function1 },
{ "anotherfunction", anotherfunction },
};
然后,您可以使用搜索(可能是二进制搜索,如果您保持名称顺序,不像我的示例)来查找与名称对应的函数指针。与dlsym()
查找相比,这种技术的一个优点是数组中的名称不必与函数名称匹配,因此如果有意义,可以提供别名。
相关文章:
- 在不使用系统的情况下从C++应用程序格式化 Linux 中的 SD 卡
- 如何解决在负数的情况下程序以相同方式工作的问题?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何在没有"路径"模块的情况下加载 cheerp-wasm 程序?
- 如何在添加文件的情况下在VSCode中调试C++程序
- 在这种情况下我应该使用哪种设计模式
- 在不添加进位的情况下添加数字的C++程序
- 如果程序在没有 sudo 的情况下运行,gtk_init会导致 ubuntu 16.04 崩溃
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- 在没有格式说明符的情况下在c++中使用类似printf的实用程序
- 在不打开应用程序的情况下在MinGW c++中播放声音(.wav)文件
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- 在这种情况下,如何在基类中设计开关大小写函数
- 如何在没有现有引擎的情况下在游戏中设计我的事件触发器框架?
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 程序在没有操作系统信号的情况下在函数中的特定行挂起
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- 在服务器应用程序的情况下,是截断线被视为良好,中性或设计差的线程
- 在不影响现有C或c++应用程序设计的情况下添加新的职责