Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

 if (last_slash == NULL || last_slash == link_target)

 /* Формат имени некорректен. */

 abort;

 /* Выделение буфера для результирующей строки. */

 result_length = last_slash - link_target;

 result = (char*)xmalloc(result_length + 1);

 /* Копирование результата. */

 strncpy(result, link_target, result_length);

 result[result_length] = '\0';

 return result;

}

Приведенные здесь функции можно использовать в самых разных программах.

■ Функции

xmalloc
,
xrealloc
и
xstrdup
являются расширенными версиями стандартных функций
malloc
,
realloc
и
strdup
, в которые дополнительно включен код проверки ошибок. В отличие от стандартных функций, которые возвращают пустой указатель в случае ошибки, наши функции немедленно завершают работу программы, если в системе недостаточно памяти.

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

■ Функция

error
сообщает о фатальной ошибке, произошедшей в программе. При этом в поток
stderr
записывается сообщение об ошибке, и работа программы завершается. Для ошибок, произошедших в системных вызовах или библиотечных функциях, предназначена функция
system_error
, которая генерирует сообщение об ошибке на основании значения переменной
errno
(см. раздел 2.2.3, "Коды ошибок системных вызовов").

■ Функция

get_self_executable_directory
определяет каталог, в котором содержится исполняемый файл текущего процесса. Это позволяет программе находить свои внешние компоненты. Функция проверяет содержимое символической ссылки
/proc/self/exe
(см. раздет 7.2.1, "
Файл /proc/self
).

В файле

common.c
определены также две полезные глобальные переменные.

■ Переменная

program_name
содержит имя выполняемой программы, указанное в списке аргументов командной строки (см. раздел 2.1.1, "Список аргументов").

■ Переменная

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

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е =

  • Читать дальше
  • 1
  • ...
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: