Программирование для Linux. Профессиональный подход
Шрифт:
2. Дочерний процесс копирует дескриптор сокета в дескрипторы
STDOUT_FILENO
и STDERR_FILENO
, соответствующие стандартным потокам вывода и ошибок (см. раздел 2.1.4, "Стандартный ввод-вывод"). Это копирование осуществляется с помощью системного вызова dup2
(см. раздел 5.4 3. "Перенаправление стандартных потоков ввода, вывода и ошибок"). Все последующие данные, записываемые в эти потоки в рамках дочернего процесса, будут направляться в сокет. 3. Дочерний процесс с помощью функции
execv
вызывает команду df -h
. 4.
waitpid
(см. раздел 5.4 2. "Системные вызовы wait
"). Этот модуль можно легко настроить на вызов другой системной команды.
11.3.4. Статистика выполняющихся процессов
Модуль
processes.so
(исходный текст приведен в листинге 11.9) сложнее остальных модулей. Он генерирует страницу, в которой содержится таблица процессов, выполняющихся в данный момент на сервере. Каждому процессу отводится в таблице одна строка. В этой строке указан идентификатор процесса, имя исполняемого файла, имена владельца и группы, которым принадлежит процесс, а также размер резидентной части процесса. Листинг 11.9. (processes.c) Серверный модуль, отображающий таблицу процессов
#include <assert.h>
#include <dirent.h>
#include <fcntl.h>
#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include "server.h"
/* Эта функция записывает в аргументы UID и GID
идентификаторы пользователя и группы, которым
принадлежит процесс с указанным идентификатором,
в случае успешного завершения возвращается нуль,
иначе -- ненулевое значение. */
static int get_uid_gid(pid_t pid, uid_t* uid, gid_t* gid) {
char dir_name[64];
struct stat dir_info;
int rval;
/* Формирование имени каталога процесса
в файловой системе /proc. */
snprintf(dir_name, sizeof(dir_name), "/proc/%d", (int)pid);
/* Получение информации о каталоге. */
rval = stat(dir_name, &dir_info);
if (rval != 0)
/* Каталог
не найден. Возможно, процесс больше
не существует. */
return 1;
/* Убеждаемся в том, что это действительно каталог. */
assert(S_ISDIR(dir_info.st_mode));
/* Определяем интересующие нас идентификаторы. */
*uid = dir_info.st_uid;
*gid = dir_info.st_gid;
return 0;
}
/* Эта функция находит имя пользователя,
соответствующее заданному идентификатору.
Возвращаемый буфер должен быть удален
в вызывающей функции. */
static char* get_user_name(uid_t uid) {
struct passwd* entry;
entry = getpwuid(uid);
if (entry == NULL)
system_error("getpwuid");
return xstrdup(entry->pw_name);
}
/* Эта функция находит имя группы, соответствующее
заданному идентификатору, возвращаемый буфер
должен быть удален в вызывающей функции. */
static char* get_group_name(gid_t gid) {
struct group* entry;
entry = getgrgid(gid);
if (entry == NULL)
system_error("getgrgid");
return xstrdup(entry->gr_name);
}
/* Эта функция находит имя программы, которую выполняет
процесс с заданным идентификатором. Возвращаемый буфер
должен быть удален в вызывающей функции. */
static char* get_program_name(pid_t pid) {
char file_name[64];
char status_info[256];
int fd;
int rval;
char* open_paren;
char* close_paren;
char* result;
/* Генерируем имя файла "stat", находящегося в каталоге
данного процесса в файловой системе /proc,
и открываем этот файл. */
snprintf(file_name, sizeof(file_name), "/proc/%d/stat",
(int)pid);
fd = open(file_name, O_RDONLY);
if (fd == 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