Программирование для 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;
/* Преобразуем идентификаторы пользователя и группы в имена. */
Поделиться:
Популярные книги
Дракон
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Викинг
1. Викинг
Приключения:
исторические приключения
8.92
рейтинг книги
Черный Маг Императора 15
15. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
На границе империй. Том 4
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
Я еще не бог. Книга XXXV
35. Дорогой барон!
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Русские дети (сборник)
Проза:
современная проза
5.60
рейтинг книги
Убийца
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Бастард Императора. Том 15
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сапер
1. Сапер
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.29
рейтинг книги
Ожерелье Странника
Приключения:
исторические приключения
7.50
рейтинг книги
Твое сердце будет разбито. Книга 1
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Черный Маг Императора 4
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Целеполагание
4. Глэрд
Фантастика:
фэнтези
боевая фантастика
рпг
5.00
рейтинг книги
Император Пограничья 8
8. Император Пограничья
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00