Сменная архитектура в C, использующем libdl

Я играл вокруг, пишущий маленькую платформу IRC в C, который я теперь собираюсь развернуть с некоторой базовой функциональностью - но кроме того, я хотел бы, чтобы это было расширяемо с плагинами!

Вплоть до сих пор, каждый раз, когда я записал чему-то связанный IRC (и я записал много приблизительно на 6 различных языках теперь... Я горю!) и на самом деле шел вперед для реализации сменной архитектуры, именно в интерпретируемом языке имел средства для того, чтобы сделать (чтение: злоупотребление) так, как затор целой канавки файла сценария eval в Ruby (плохо!).

Теперь я хочу злоупотребить чем-то в C!

В основном существует три вещи, которые я мог сделать

  1. определите простой язык сценария в моей программе
  2. используйте существующий, встраивая интерпретатор
  3. используйте libdl для загрузки *.so модулей на времени выполнения

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

Логически думая, очевидная "цепочка боли" была бы (самой низкой к самому высокому) 2-> 1-> 3 по простой причине, что libdl имеет дело с необработанным кодом, который может (и быть), взрываются в моей поверхности, как правило.

Таким образом, этот вопрос выходит к Вам, поддерживающим пользователям stackoverflow, Вы думаете, что libdl до этой задачи или даже реалистической мысли?

6
задан LukeN 21 May 2010 в 14:09
поделиться

3 ответа

libdl очень хорошо подходит для подключаемых архитектур - в определенных границах :-). Она часто используется именно для таких целей во множестве различных программ. Он хорошо работает в ситуациях, когда есть четко определенный API/интерфейс между основной программой и подключаемым модулем, и несколько различных подключаемых модулей реализуют один и тот же API/интерфейс. Например, ваш IRC-клиент может иметь подключаемые модули, реализующие шлюзы к различным IM-протоколам (Jabber, MSN, Sametime и т.д.) - все они очень похожи, поэтому вы можете определить API с такими функциями, как "отправить сообщение", "проверить ответ" и т.д. - и написать кучу подключаемых модулей, каждый из которых реализует свой протокол.

Ситуация, в которой это работает менее эффективно, - это когда вы хотите, чтобы подключаемые модули вносили произвольные изменения в поведение основной программы - так, как, например, подключаемые модули Firefox могут изменять поведение вкладок браузера, их внешний вид, добавлять/удалять кнопки и так далее. Такого рода вещи гораздо проще реализовать на динамическом языке (поэтому большая часть Firefox реализована на javascript), и если вам нужна именно такая настройка, вам лучше выбрать вариант (2) и написать большую часть пользовательского интерфейса на скриптовом языке...

3
ответ дан 17 December 2019 в 00:04
поделиться

Существует множество существующих программ на C, которые используют dlopen () / dlsym () для реализации архитектуры плагина (включая более одной Связанный с IRC); так что да, это определенно соответствует задаче.

1
ответ дан 17 December 2019 в 00:04
поделиться

dlopen() / dlsym(), вероятно, самый простой способ. Глупый псевдокод:

int run_module(const char *path, char **args)
{
   void *module;
   void (*initfunc)(char **agrs);
   int rc = 0;

   module = dlopen(path, RTLD_NOW);
   if (module == NULL)
      err_out("Could not open module %s", path);

   initfunc = dlsym(module, "module_init");
   if (initfunc == NULL) {
      dlclose(module);
      err_out("Could not find symbol init_func in %s", path);
   }

   rc = initfunc(args);

   dlclose(module);

   return rc;
}

Конечно, вы захотите гораздо больше проверки ошибок, а также код, который действительно делает что-то полезное :) Однако чрезвычайно просто и удобно написать архитектуру плагина вокруг пары и опубликовать простую спецификацию, чтобы другие могли сделать то же самое.

Вам, вероятно, нужно что-то более похожее на load_module(), вышеупомянутое просто загружает SO, ищет точку входа и блокирует, пока эта точка входа не выйдет.

Это не значит, что написание собственного языка сценариев - плохая идея. Люди могли бы писать сложные фильтры, респондеры и т.д. без особых усилий. Возможно, и то, и другое было бы хорошей идеей. Я не знаю, нужен ли вам полноценный интерпретатор LUA... возможно, вы могли бы придумать что-то, что упрощает выполнение действий на основе регулярных выражений.

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

3
ответ дан 17 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: