Я играл вокруг, пишущий маленькую платформу IRC в C, который я теперь собираюсь развернуть с некоторой базовой функциональностью - но кроме того, я хотел бы, чтобы это было расширяемо с плагинами!
Вплоть до сих пор, каждый раз, когда я записал чему-то связанный IRC (и я записал много приблизительно на 6 различных языках теперь... Я горю!) и на самом деле шел вперед для реализации сменной архитектуры, именно в интерпретируемом языке имел средства для того, чтобы сделать (чтение: злоупотребление) так, как затор целой канавки файла сценария eval
в Ruby (плохо!).
Теперь я хочу злоупотребить чем-то в C!
В основном существует три вещи, которые я мог сделать
Я люблю третий и скорее избегаю других двух опций, если это возможно. Возможно, я - какой-то мазохист, но я думаю, что это могла быть и забава и полезный для изучения целей.
Логически думая, очевидная "цепочка боли" была бы (самой низкой к самому высокому) 2-> 1-> 3 по простой причине, что libdl имеет дело с необработанным кодом, который может (и быть), взрываются в моей поверхности, как правило.
Таким образом, этот вопрос выходит к Вам, поддерживающим пользователям stackoverflow, Вы думаете, что libdl до этой задачи или даже реалистической мысли?
libdl
очень хорошо подходит для подключаемых архитектур - в определенных границах :-). Она часто используется именно для таких целей во множестве различных программ. Он хорошо работает в ситуациях, когда есть четко определенный API/интерфейс между основной программой и подключаемым модулем, и несколько различных подключаемых модулей реализуют один и тот же API/интерфейс. Например, ваш IRC-клиент может иметь подключаемые модули, реализующие шлюзы к различным IM-протоколам (Jabber, MSN, Sametime и т.д.) - все они очень похожи, поэтому вы можете определить API с такими функциями, как "отправить сообщение", "проверить ответ" и т.д. - и написать кучу подключаемых модулей, каждый из которых реализует свой протокол.
Ситуация, в которой это работает менее эффективно, - это когда вы хотите, чтобы подключаемые модули вносили произвольные изменения в поведение основной программы - так, как, например, подключаемые модули Firefox могут изменять поведение вкладок браузера, их внешний вид, добавлять/удалять кнопки и так далее. Такого рода вещи гораздо проще реализовать на динамическом языке (поэтому большая часть Firefox реализована на javascript), и если вам нужна именно такая настройка, вам лучше выбрать вариант (2) и написать большую часть пользовательского интерфейса на скриптовом языке...
Существует множество существующих программ на C, которые используют dlopen ()
/ dlsym ()
для реализации архитектуры плагина (включая более одной Связанный с IRC); так что да, это определенно соответствует задаче.
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... возможно, вы могли бы придумать что-то, что упрощает выполнение действий на основе регулярных выражений.
Тем не менее, подключаемые модули не только упростят вашу жизнь, но и помогут вам вырастить сообщество людей, разрабатывающих материал для всего, что вы создадите.