Программирование для Linux. Профессиональный подход
Шрифт:
/* Файл не удалось открыть. Возможно, процесс
больше не существует. */
return NULL;
/* Чтение содержимого файла
rval = read(fd, status_info, sizeof(status_info) — 1);
close(fd);
if (rval <= 0)
/* По какой-то причине файл не удалось прочитать, завершаем
работу. */
return NULL;
/*
Завершаем прочитанный текст нулевым символом. */
status_info[rval] = '\0';
/* Имя программы -- это второй элемент файла, заключенный в
круглые скобки. Находим местоположение скобок. */
open_paren = strchr(status_info, '(');
close_paren = strchr(status_info, ')');
if (open_paren == NULL ||
close_paren == NULL || close_paren < open_paren)
/* He удалось найти скобки, завершаем работу. */
return NULL;
/* Выделение памяти для результирующей строки */
result = (char*)xmalloc(close_paren — open_paren);
/* Копирование имени программы в буфер. */
strncpy(result, open_paren + 1, close_paren - open_paren — 1);
/* Функция strncpy не завершает строку нулевым символом,
приходится это делать самостоятельно. */
result[close_paren - open_paren - 1] = '\0';
/* Конец работы. */
return result;
}
/* Эта функция определяет размер (в килобайтах) резидентной
части процесса с заданным идентификатором.
В случае ошибки возвращается -1. */
static int get_rss(pid_t pid) {
char file_name[64];
int fd;
char mem_info[128];
int rval;
int rss;
/* Генерируем имя файла "statm", находящегося в каталоге
данного процесса в файловой системе proc. */
snprintf(file_name, sizeof(file_name), "/proc/%d/statm",
(int)pid);
/* Открытие файла. */
fd = open(file_name, O_RDONLY);
if (fd == -1)
/* Файл не удалось открыть. Возможно, процесс больше не
существует. */
return -1;
/*
Чтение содержимого файла. */
rval = read(fd, mem_info, sizeof(mem_info) — 1);
close(fd);
if (rval <= 0)
/* Файл не удалось прочитать, завершаем работу. */
return -1;
/* Завершаем прочитанный текст нулевым символом. */
mem_infо[rval] = '\0';
/* Определяем размер резидентной части процесса. Это второй
элемент файла. */
rval = sscanf(mem_info, "%*d %d", &rss);
if (rval != 1)
/* Содержимое файла statm отформатировано непонятным
образом. */
return -1;
/* Значения в файле statm приведены в единицах, кратных размеру
системной страницы. Преобразуем в килобайты. */
return rss * getpagesize / 1024;
}
/* Эта функция генерирует строку таблицы для процесса
с заданным идентификатором. Возвращаемый буфер должен
удаляться в вызывающей функции, в случае ошибки
возвращается NULL. */
static char* format_process_info(pid_t pid) {
int rval;
uid_t uid;
gid_t gid;
char* user_name;
char* group_name;
int rss;
char* program_name;
size_t result_length;
char* result;
/* Определяем идентификаторы пользователя и группы, которым
принадлежит процесс. */
rval = get_uid_gid(pid, &uid, &gid);
if (rval != 0)
return NULL;
/* Определяем размер резидентной части процесса. */
rss = get_rss(pid);
if (rss == -1)
return NULL;
/* Определяем имя исполняемого файла процесса. */
program_name = get_program_name(pid);
if (program_name == NULL)
return NULL;
/* Преобразуем идентификаторы пользователя и группы в имена. */
Поделиться:
Популярные книги
Кодекс Охотника. Книга XXXIX
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Я до сих пор царь. Книга XXXII
32. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Барон ненавидит правила
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Представь себе… Беседы о деньгах, политике и жизни вообще
Религия и эзотерика:
самосовершенствование
5.00
рейтинг книги
Точка Бифуркации VI
6. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.40
рейтинг книги
Свадьба на выбор, или Женихи в ассортименте
Любовные романы:
современные любовные романы
7.71
рейтинг книги
Неучтенный элемент. Том 10
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Литрпг
5.00
рейтинг книги
Тринадцатый
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Записки уцелевшего
Документальная литература:
биографии и мемуары
7.00
рейтинг книги
Мифы и правда о плане Барбаросса
Анатомия армии
Научно-образовательная:
история
5.00
рейтинг книги
Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Игра киллера
Детективы:
боевики
6.25
рейтинг книги
Законы рода
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
4.75