Чтение онлайн

на главную - закладки

Жанры

Программирование для 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
, в которые дополнительно включен код проверки ошибок. В отличие от стандартных функций, которые возвращают пустой указатель в случае ошибки, наши функции немедленно завершают работу программы, если в системе недостаточно памяти.

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

Хозяин Теней 7

Петров Максим Николаевич
7. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 7

Гримуар темного лорда II

Грехов Тимофей
2. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда II

Последний Герой. Том 1

Дамиров Рафаэль
1. Последний герой
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Последний Герой. Том 1

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Гримуар темного лорда IX

Грехов Тимофей
9. Гримуар темного лорда
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда IX

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Прапорщик. Назад в СССР. Книга 6

Гаусс Максим
6. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 6

Родословная. Том 4

Ткачев Андрей Юрьевич
4. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 4

Офицер

Земляной Андрей Борисович
1. Офицер
Фантастика:
боевая фантастика
7.21
рейтинг книги
Офицер

Мастер решений

Земляной Андрей Борисович
3. Специалист по выживанию
Фантастика:
боевая фантастика
космическая фантастика
6.20
рейтинг книги
Мастер решений

Эволюционер из трущоб. Том 9

Панарин Антон
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 9