Программирование для Linux. Профессиональный подход
Шрифт:
vec_size *= 2;
vec = xrealloc(vec, vec_size - sizeof(struct iovec));
}
/* Сохраняем в массиве информацию о процессе. */
vec[vec_length].iov_base = process_info;
vec[vec_length].iov_len = strlen(process_info);
++vec_length;
}
/* Конец обработки списка каталогов */
closedir(proc_listing);
/* Добавляем HTML-код конца
страницы. */
vec[vec_length].iov_base = page_end;
vec[vec_length].iov_len = strlen(page_end);
++vec_length;
/* Передаем всю страницу клиенту. */
writev(fd, vec, vec_length);
/* Удаляем выделенные буферы. Первый и последний буферы
являются статическими, поэтому не должны удаляться. */
for (i = 1; i < vec_length - 1; ++i)
free(vec[i].iov_base);
/* Удаляем массив iovec. */
free(vec);
}
Задача сбора информации о процессах и представления ее в виде HTML-таблицы разбивается на ряд более простых операций.
■ Функция
get_uid_gid
возвращает идентификатор пользователя и группы, которым принадлежит процесс. Для этого вызывается функция stat
(описана в приложении Б, "Низкоуровневый ввод-вывод"), берущая информацию из каталога процесса в файловой системе /proc. ■ Функция
get_user_name
возвращает имя пользователя, соответствующее заданному идентификатору. Она просто вызывает библиотечную функцию getpwuid
, которая обращается к файлу /etc/passwd
и возвращает копию строки из него. Функция get_group_name
находит имя группы по заданному идентификатору. Она вызывает функцию getgrgid
. ■ Функция
gеt_program_name
возвращает имя программы, соответствующей заданному процессу. Эта информация извлекается из файла stat
, находящегося в каталоге процесса в файловой системе /proc
(см. раздел 7.2, "Каталоги процессов"). Мы поступаем так, а не проверяем символические ссылки exe
или cmdline
, поскольку последние недоступны, если серверный процесс не принадлежит тому же пользователю, что и проверяемый процесс. ■ Функция
get_rss
определяет объем резидентной части процесса. Эта информация содержится во втором элементе файла statm
(см. раздел 7.2.6, "Статистика использования процессом памяти"), находящегося в каталоге процесса в файловой системе /proc
. ■ Функция
format_process_info
генерирует набор HTML-тэгов для строки таблицы, представляющей заданный процесс. Здесь вызываются все вышеперечисленные функции. ■ Функция
module_generate
генерирует HTML-страницу с таблицей процессов. Выводная информация включает начальный HTML-блок (переменная page_start
), строки с информацией о процессах (создаются функцией format_process_info
) и конечный HTML-блок (переменная page_end
). Функция
module_generate
определяет идентификаторы процессов, проверяя содержимое файловой системы /proc
. Для получения и анализа списка каталогов вызываются функции opendir
и readdir
(описаны в приложении Б, "Низкоуровневый ввод-вывод''). Из данного списка отбираются элементы,
Поскольку в таблице может содержаться достаточно большое число строк, последовательная запись их в сокет с помощью функции
write
приведет к ненужному повышению трафика. Для оптимизации числа передаваемых пакетов используется функция writev (описана в приложении Б, "Низкоуровневый ввод-вывод"). Для нее создается массив vec
, состоящий из элементов типа iovec
. Так как число процессов не известно заранее приходится начинать с маленького массива и увеличивать его по мере необходимости. В переменной vec_length
содержится число используемых элементов массива vec
, а в переменной vec_size
— число выделенных элементов. Когда эти переменные становятся почти равными друг другу, размер массива удваивается с помощью функции xrealloc
. По окончании работы с массивом удаляются все адресуемые в нем строки, а также сам массив. 11.4. Работа с сервером
Если бы демонстрационную программу нужно было распространять в виде исходных текстов, сопровождать и переносить на другие платформы, потребовалось бы упаковать ее с помощью GNU-утилит Automake и Autoconf. Но их рассмотрение выходит за рамки нашей книги.
11.4.1. Файл Makefile
Вместо утилиты Autoconf мы воспользуемся простым файлом
Makefile
, совместимым с GNU-утилитой Make. [39] Этот файл упростит компиляцию и компоновку сервера и его модулей. Содержимое файла показано в листинге 11.10.39
Эта утилита входит в состав Linux.
Листинг 11.10. (Makefile) Файл конфигурации сервера
### Конфигурация. ##############################################
# Стандартные параметры компилятора языка С.
CFLAGS = -Wall -g
# Исходные файлы сервера.
SOURCES = server.c module.c common.c main.c
# Соответствующие объектные файлы.
OBJECTS = $(SOURCES:.c=.o)
# Совместно используемые библиотеки серверных модулей.
MODULES = diskfree.so issue.so processes.so time.so
### Правила. ####################################################
# Служебный целевой модуль.
.PHONY: all clean
# Стандартный целевой модуль: компиляция всех файлов.
all: server $(MODULES)
# Удаление всех компонентов.
clean:
rm -f $(OBJECTS) $(MODULES) server
# Главная серверная программа, должна компоноваться с флагами
# -Wl,-export-dynamic, чтобы динамически загружаемые модули могли
# находить в программе символические константы. Подключается также
# библиотека libdl, в которой находятся функции динамической
# загрузки.
server: $(OBJECTS)
Поделиться:
Популярные книги
Усадьба леди Анны
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Светлая тьма. Советник
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Двойник Короля
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Его нежеланная истинная
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Последний Паладин. Том 2
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Измена. Наследник для дракона
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Идеальный мир для Лекаря 9
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Мастер темных Арканов
1. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Адвокат империи
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Кодекс Охотника. Книга XXI
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Вечный. Книга II
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Законы Рода. Том 3
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Наследник
1. Старицкий
Приключения:
исторические приключения
5.00