Оглавление

  • 1 Как создать архитектуру плагина на C?
  • 2 проблемы, с которыми я столкнулся
  • 3 Как решить эту проблему?
  • 4 плюса и минусы архитектуры плагинов.

1 Как сделать архитектуру плагина на C?

Архитектура плагинов — отличный дизайн для создания расширяемого и отказоустойчивого программного обеспечения. Модули программного обеспечения загружались динамически из подключаемых модулей во время работы. На языке C эта архитектура может быть реализована с помощью dlopen, который является программным интерфейсом для загрузчика динамической компоновки в Linux.

Другими словами, программное обеспечение разделено на отдельные модули, которые скомпилированы и связаны в общие библиотеки. И программное обеспечение может динамически загружать общие библиотеки в память, это то, что я хочу, чтобы генезис был. Genesis — это библиотека промежуточного программного обеспечения для архитектуры реактора, над которой я работаю.

2 проблемы, с которыми я столкнулся

Чтобы создать архитектуру плагинов, я использую dlopen API для реализации модулей плагинов. Но я столкнулся с некоторыми проблемами при разработке, общие библиотеки или модули не должны зависеть от других библиотек. Другими словами, dlopen потерпит неудачу при загрузке библиотек, вызывающих символы, которые ему не принадлежат.

Поэтому модули должны разрабатываться независимо от других частей исходного кода. Включить структуру данных в заголовочный файл — это нормально, но вызов функций может привести к сбою dlopen.

dlopen имеет два флага для управления своим поведением — RTLD_LAZY, RTLD_NOW. когда вы используете флаг RTLD_NOW, dlopen просто возвращает обработчик none, когда вы совершаете вышеуказанные ошибки, в то время как при использовании флага RTLD_LAZY dlopen может возвращать обработчик, но сообщает об ошибке с именем «не удается найти символ» во время выполнения.

3 Как решить эту проблему?

Возьмем, к примеру, класс reactor genesis, я пишу еще один заголовочный файл reactor-internal.h, который экспортирует детали класса reactor наружу. Но таким образом частично повреждается инкапсуляция.

// reactor.h
#ifndef _REACTOR_H
#define _REACTOR_H
#include "typedef.h"
#include "config.h"
#include "allocator.h"
DECLES_BEGIN
struct _Reactor;
typedef struct _Reactor Reactor;
Reactor* reactor_create(Config* config, Allocator* alloc);
Ret reactor_run(Reactor* thiz);
Ret reactor_stop(Reactor* thiz);
void reactor_destroy(Reactor* thiz);
DECLES_END
#endif /* _REACTOR_H */
// reactor-internal.h
#ifndef _REACTOR_INTERNAL_H
#define _REACTOR_INTERNAL_H
#include "typedef.h"
#include "reactor.h"
#include "main_loop.h"
#include "modules_manager.h"
#include "sources_manager.h"
#include "logger.h"
DECLES_BEGIN
struct _Reactor {
    Logger* logger;
    Allocator* alloc;
    Config* config;
    SourcesManager* sources_manager;
    ModulesManager* modules_manager;
    MainLoop* main_loop;
};
Ret reactor_get_main_loop(Reactor* thiz, MainLoop** main_loop);
Ret reactor_set_main_loop(Reactor* thiz, MainLoop* main_loop);
Ret reactor_get_modules_manager(Reactor* thiz, ModulesManager** modules_manager);
Ret reactor_set_modules_manager(Reactor* thiz, ModulesManager* modules_manager);
Ret reactor_get_sources_manager(Reactor* thiz, SourcesManager** sources_manager);
Ret reactor_set_sources_manager(Reactor* thiz, SourcesManager* sources_manager);
DECLES_END
#endif /* _REACTOR_NTERNAL_H */

Другой способ решить эту проблему — связать объектный файл реактора с подключаемыми модулями. Это самый эффективный способ, но такой уродливый.

4 Плюсы и минусы архитектуры плагинов.

Вот моя точка зрения: плюсы архитектуры плагинов в C заключаются в том, что она обеспечивает расширяемую архитектуру в разработке программного обеспечения, минусы архитектуры плагинов в том, что она разрушает принцип ООП.

Таким образом, код C в стиле ООП не подходит для использования архитектуры плагинов, а коду C, ориентированному на архитектуру плагинов, не хватает стиля ООП. Но одна из замечательных особенностей кода C заключается в том, что он не привязан к принципам ООП, ООП — это просто некоторые мысли в разработке программного обеспечения. Итак, плюсы .vs. минусы, ну…