Программирование для Linux. Профессиональный подход
Шрифт:
user_name = get_user_name(uid);
group_name = get_group_name(gid);
/* Вычисляем длину строки, в которую будет помещен результат,
и выделяем для нее буфер. */
result_length =
strlen(program_name) + strlen(user_name) +
strlen(group_name) + 128;
result = (char*)xmalloc(result_length);
/* Форматирование результата. */
snprintf(result, result_length,
"<tr><td align=\" right\">%d</td><td><tt>%s</tt></td><td>%s</td>"
"<td>%s</td><td align= \"right\">%d</td></tr>\n",
(int)pid, program_name, user_name, group_name, rss);
/*
Очистка памяти. */
free(program_name);
free(user_name);
free(group_name);
/* Конец работы. */
return result;
}
/* HTML-код начала страницы, содержащей таблицу процессов. */
static char* page_start =
"<html>\n"
" <body>\n"
" <table cellpadding=\"4\" cellspacing=\"0\" border=\"1\">\n"
" <thead>\n"
" <tr>\n"
" <th>PID</th>\n"
" <th>Program</th>\n"
" <th>User</th>\n"
" <th>Group</th>\n"
" <th>RSS (KB)</th>\n"
" </tr>\n"
" </thead>\n"
" <tbody>\n";
/* HTML-код конца страницы, содержащей таблицу процессов. */
static char* page_end =
" </tbody>\n"
" </table>\n"
" </body>\n"
"</html>\n";
void module_generate(int fd) {
size_t i;
DIR* proc_listing;
/* Создание массива iovec. В этот массив помещается выходная
информации, причем массив может увеличиваться динамически. */
/* Число используемых элементов массива */
size_t vec_length = 0;
/* выделенный размер массива */
size_t vec_size = 16;
/*
Массив элементов iovec. */
struct iovec* vec =
(struct iovec*)xmalloc(vec_size *
sizeof(struct iovec));
/* Сначала в массив записывается HTML-код начала страницы. */
vec[vec_length].iov_base = page_start;
vec[vec_length].iov_len = strlen(page_start);
++vec_length;
/* Получаем список каталогов в файловой системе /proc. */
proc_listing = opendir("/proc");
if (proc_listing == NULL)
system_error("opendir");
/* Просматриваем список каталогов. */
while (1) {
struct dirent* proc_entry;
const char* name;
pid_t pid;
char* process_info;
/* Переходим к очередному элементу списка. */
proc_entry = readdir(proc_listing);
if (proc_entry == NULL)
/* Достигнут конец списка. */
break;
/* Если имя каталога не состоит из одних цифр, то это не
каталог процесса; пропускаем его. */
name = proc_entry->d_name;
if (strspn(name, "0123456789") != strlen(name))
continue;
/* Именем каталога является идентификатор процесса. */
pid = (pid_t)atoi(name);
/* генерируем HTML-код для строки таблицы, содержащей
описание данного процесса. */
process_info = format_process_info(pid);
if (process_info == NULL)
/* Произошла какая-то ошибка. Возможно, процесс уже
завершился. Создаем строку-заглушку. */
process_info =
"<tr><td colspan=\"5\">ERROR</td></tr>";
/* Убеждаемся в том, что в массиве iovec достаточно места
для записи буфера (один элемент будет добавлен в массив
по окончании обработки списка процессов). Если места
не хватает, удваиваем размер массива. */
if (vec_length == vec_size - 1) {
Поделиться:
Популярные книги
Усадьба леди Анны
Любовные романы:
любовно-фантастические романы
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