Программирование для 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) {
/* Вывод сообщения об ошибке на основании значения
переменной errno. */
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
, в которые дополнительно включен код проверки ошибок. В отличие от стандартных функций, которые возвращают пустой указатель в случае ошибки, наши функции немедленно завершают работу программы, если в системе недостаточно памяти.
Поделиться:
Популярные книги
Мой муж – чудовище! Изгнанная жена дракона
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Андер Арес
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Статьи
Документальная литература:
публицистика
5.00
рейтинг книги
Гримуар темного лорда IV
4. Гримуар темного лорда
Фантастика:
фэнтези
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Древесный маг Орловского княжества 2
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Забытые боги
4. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том IV
4. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Я еще граф. Книга #8
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Бастард Бога (Дилогия)
Фантастика:
альтернативная история
5.11
рейтинг книги
Ваше Сиятельство 5
5. Ваше Сиятельство
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Ермак. Регент
10. Ермак
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Корпорация М.И.Ф. (сборник)
Фантастика:
юмористическая фантастика
8.79