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

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

Жанры

Программирование для 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)

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

Глэрд IX: Легионы во Тьме

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

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Двойник Короля 10

Скабер Артемий
10. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 10

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Точка Бифуркации VII

Смит Дейлор
7. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации VII

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2

Законы Рода. Том 7

Андрей Мельник
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Удержать 13-го

Уолш Хлоя
Любовные романы:
остросюжетные любовные романы
эро литература
зарубежные любовные романы
5.00
рейтинг книги
Удержать 13-го

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2

Меченный смертью. Том 2

Юрич Валерий
2. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Меченный смертью. Том 2

Личный аптекарь императора. Том 6

Карелин Сергей Витальевич
6. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Личный аптекарь императора. Том 6

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Барон Дубов 8

Карелин Сергей Витальевич
8. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 8