11.2.2. Загрузка серверных модулей
11.2.2. Загрузка серверных модулей
В файле module.c (листинг 11.3) содержится реализация динамически загружаемых серверных модулей. Загруженному модулю соответствует структура типа server_module, который определен в файле server.h.
Листинг 11.3. (module.c) Загрузка и выгрузка серверных модулей
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "server.h"
char* module_dir;
struct server_module* module_open(const char* module_name) {
char* module_path;
void* handle;
void (*module_generate)(int);
struct server_module* module;
/* Формирование путевого имени библиотеки, в которой содержится
загружаемый модуль. */
module_path =
(char*)xmalloc(strlen(module_dir) +
strlen(module_name) + 2);
sprintf(module_path, "%s/%s", module_dir, module_name);
/* Попытка открыть файл MODULE_PATH как совместно используемую
библиотеку. */
handle = dlopen(module_path, RTLD_NOW);
free (module_path);
if (handle == NULL) {
/* Ошибка: либо путь не существует, либо файл не является
совместно используемой библиотекой. */
return NULL;
}
/* Чтение константы module_generate из библиотеки. */
module_generatе =
(void(*)int))dlsym(handle,
"module_generate");
/* Проверяем, найдена ли константа. */
if (module_generate == NULL) {
/* Константа отсутствует в библиотеке. Очевидно, файл не
является серверным модулем. */
dlclose(handle);
return NULL;
}
/* Выделение и инициализация объекта server_module. */
module =
(struct server_module*)xmalloc
(sizeof (struct server_module));
module->handle = handle;
module->name = xstrdup(module_name);
module->generate_function = module_generate;
/* Успешное завершение функции. */
return module;
}
void module_close(struct server_module* module) {
/* Закрытие библиотеки. */
dlclose(module->handle);
/* Удаление строки с именем модуля. */
free((char*)module->name);
/* Удаление объекта module. */
free(module);
}
Каждый модуль содержится в файле совместно используемой библиотеки (см. раздел 2.3.2, "Совместно используемые библиотеки") и должен экспортировать функцию module_generate(). Эта функция генерирует HTML-код Web-страницы и записывает его в сокет, дескриптор которого передан ей в качестве аргумента.
В файле module.c определены две функции.
? Функция module_open() пытается загрузить серверный модуль с указанным именем. Файл модуля имеет расширение .so, так как это совместно используемая библиотека. Функция открывает библиотеку с помощью функции dlopen() и ищет в библиотеке константу module_generate посредством функции dlsym() (описаны в разделе 2.3.6, "Динамическая загрузка и выгрузка"). Если библиотеку не удалось открыть или в ней не обнаружена экспортируемая константа module_generate, возвращается значение NULL. В противном случае выделяется и возвращается объект module.
? Функция module_close() закрывает совместно используемую библиотеку, соответствующую указанному модулю, и удаляет объект module.
В файле module.c определена также глобальная переменная module_dir. В ней записано имя каталога, в котором функция module_open() будет искать совместно используемые библиотеки.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Сборка модулей
Сборка модулей Благодаря новой системе сборки "kbuild", в ядрах серии 2.6 сборка модулей выполняется значительно проще, чем в старых сериях. Первое, что нужно сделать при сборке модулей, — это решить, где будет находиться исходный код модуля. Исходный код модуля необходимо
Инсталляция модулей
Инсталляция модулей Скомпилированные модули должны быть инсталлированы в каталог /lib/modules/version/kernel. Например, для ядра 2.6.10 скомпилированный модуль управления удочкой будет находиться в файле /lib/modules/2.6.10/kernel/drivers/char/fishing.ko, если исходный код находился непосредственно в
Загрузка модулей
Загрузка модулей Наиболее простой способ загрузки модуля — это воспользоваться утилитой insmod. Эта утилита выполняет самые общие действия. Она просто загружает тот модуль, который ей указан в качестве параметра. Утилита insmod не отслеживает зависимости и не выполняет
Параметры модулей
Параметры модулей Ядро Linux предоставляет возможность драйверам определять параметры, которые пользователь будет указывать при загрузке ядра или модуля. Эти параметры будут доступны коду модуля в качестве глобальных переменных. Указанные параметры модулей также будут
Вокруг модулей
Вокруг модулей В этой главе были рассмотрены особенности написания, сборки, загрузки и выгрузки модулей ядра. Мы обсудили, что такое модули и каким образом ядро операционной системы Linux, несмотря на то что оно является монолитным, может загружать код динамически. Были
Загрузка модулей Apache
Загрузка модулей Apache Одно из преимуществ Apache состоит в том, что этот Web-сервер является расширяемым. Программист может написать новый модуль, реализующий дополнительные возможности, при этом исходный код Apache остается неизменным. Более того, для использования нового
17.5.6. Компиляция модулей
17.5.6. Компиляция модулей Если вы сконфигурировали какие-то драйверы как отдельные модули (выбирали при конфигурации вариант "m" при ответе на некоторые вопросы), то вы теперь должны еще выполнить команду make modules, а затем еще команду make modules_install. В файле Documentation/modules.txt можно
Загрузка модулей Zaptel без использования сценариев
Загрузка модулей Zaptel без использования сценариев В данном разделе будет кратко рассмотрена загрузка модулей zaptel и ztdummy без сценария запуска CentOS. Если модуль zaptel будет использоваться только для модуля ztdummy, он не требует никакой конфигурации. Если планируется загружать
7.2.2. Загрузка дополнительных модулей
7.2.2. Загрузка дополнительных модулей В первую очередь, командой /sbin/depmod -a, выполняется проверка зависимостей модулей после чего производится подгрузка модулей, необходимых для работы сценария. Старайтесь в ваших сценариях загружать только необходимые модули. Например,
Конструирование модулей
Конструирование модулей Введение Эта обучающая серия обещает стать возможно одной из самых долгоиграющих мини-серий в истории, конкурирующей только с задержкой на Томе IV Кнута. Начатая в 1988, эта серия вошла в четырехлетнюю паузу в 1990, когда «заботы мира сего», изменения
Планирование модулей
Планирование модулей Нельзя сказать, что проблема организации модулей слишком сложна. Имеет смысл подумать только над тем, сколько модулей следует создать и какие процедуры должны в них войти. Вот те моменты, о которых нужно при этом помнить.Процедуры могут вызывать или
Обработка серверных событий
Обработка серверных событий С учетом сегодняшнего состояния World Wide Web нельзя не принимать во внимание природу взаимодействия браузера и Web-сервера. В основе такого взаимодействия лежит цикл запросов и ответов HTTP в процессе выполнения которых состояния не сохраняются. И
Тестирование модулей
Тестирование модулей Тестирование модулей (unit testing) представляет собой процесс тестирования отдельных частей независимо от самой программы.Одним из новых методов разработки программного обеспечения, который появился уже при написании этой книги, является
Разработка модулей
Разработка модулей Разработка модулей PSQL является жизненно важной частью деятельности, как разработчика, так и администратора базы данных. Поскольку запросы администратора Firebird ясны, обычно на практике эти две роли объединяются. В процессе разработки обычно довольно
Terralab.ru: Самый дорогой процессор AMD [Не считая серверных процессоров, конечно]
Terralab.ru: Самый дорогой процессор AMD [Не считая серверных процессоров, конечно] Тестирование процессоров - занятие неблагодарное. Если новый CPU отличается от предшественников только тактовой частотой и объемом кэша, то вроде и писать особенно не о чем, роль журналиста