Программирование для Linux. Профессиональный подход
Шрифт:
extern char* module_dir;
/* Функция, пытающаяся загрузить указанный серверный модуль.
Если модуль существует, возвращается структура
с его описанием, в противном случае возвращается NULL. */
extern struct server_module* module_open(const char* module_path);
/* Закрытие модуля и удаление объекта MODULE. */
extern void module_close(struct server_module* module);
/***
Символические константы файла server.c. ********************/
/* Запуск сервера по адресу LOCAL_ADDRESS и порту PORT. */
extern void server_run(struct in_addr local_address, uint16_t port);
#endif /* SERVER_H */
11.2.1. Общие функции
Файл
common.c
(листинг 11.2) содержит функции общего назначения, используемые в разных частях программы. Листинг 11.2. (common.c) Функции общего назначения
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "server.h"
const char* program_name;
int verbose;
void* xmalloc(size_t size) {
void* ptr = malloc(size);
/* Аварийное завершение, если выделить память не удалось. */
if (ptr == NULL)
abort;
else
return ptr;
}
void* xrealloc(void* ptr, size_t size) {
ptr = realloc(ptr, size);
/* Аварийное завершение, если выделить память не удалось. */
if (ptr == NULL)
abort;
else
return ptr;
}
char* xstrdup(const char* s) {
char* copy = strdup(s);
/* Аварийное завершение, если выделить память не удалось. */
if (сору == NULL)
abort;
else
return copy;
}
void system_error(const char* operation) {
/* Вывод сообщения об ошибке на основании значения
error(operation, strerror(errno));
}
void error(const char* cause, const char* message) {
/* Запись сообщения об ошибке в поток stderr. */
fprintf(stderr, "%s: error: (%s) %s\n", program_name,
cause, message);
/* Завершение программы */
exit(1);
}
char* get_self_executable_directory {
int rval;
char link_target[1024];
char* last_slash;
size_t result_length;
char* result;
/* Чтение содержимого символической ссылки /proc/self/exe. */
rval =
readlink("/proc/self/exe", link_target,
sizeof(link_target));
if (rval == -1)
/* Функция readlink завершилась неудачей, поэтому выходим
из программы. */
abort;
else
/* Запись нулевого символа в конец строки. */
link_target[rval] = '\0';
/* Удаление имени файла,
чтобы осталось только имя каталога. */
last_slash = strrchr(link_target, '/');
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
, в которые дополнительно включен код проверки ошибок. В отличие от стандартных функций, которые возвращают пустой указатель в случае ошибки, наши функции немедленно завершают работу программы, если в системе недостаточно памяти.
Поделиться:
Популярные книги
Кодекс Охотника. Книга XXXIX
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Я до сих пор царь. Книга XXXII
32. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Барон ненавидит правила
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Представь себе… Беседы о деньгах, политике и жизни вообще
Религия и эзотерика:
самосовершенствование
5.00
рейтинг книги
Точка Бифуркации VI
6. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.40
рейтинг книги
Свадьба на выбор, или Женихи в ассортименте
Любовные романы:
современные любовные романы
7.71
рейтинг книги
Неучтенный элемент. Том 10
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Литрпг
5.00
рейтинг книги
Тринадцатый
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Записки уцелевшего
Документальная литература:
биографии и мемуары
7.00
рейтинг книги
Мифы и правда о плане Барбаросса
Анатомия армии
Научно-образовательная:
история
5.00
рейтинг книги
Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Игра киллера
Детективы:
боевики
6.25
рейтинг книги
Законы рода
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
4.75