Программирование для 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;
/* Преобразуем идентификаторы пользователя и группы в имена. */
Поделиться:
Популярные книги
Ботаник 2
2. Ботаник
Фантастика:
фэнтези
боевая фантастика
6.00
рейтинг книги
Дважды одаренный. Том II
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Интриганка
Приключения:
исторические приключения
9.24
рейтинг книги
Эволюционер из трущоб. Том 11
11. Эволюционер из трущоб
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Источник
11. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
7.00
рейтинг книги
На границе империй. Том 10. Часть 13
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 13
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сапер
1. Сапер
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.29
рейтинг книги
На границе империй. Том 6
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
Александр Агренев. Трилогия
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Путь к бессмертию 2
2. Девятихвостый Богатырь
Фантастика:
попаданцы
сказочная фантастика
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Рядовой. Назад в СССР. Книга 1
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
На цепи
1. На цепи
Старинная литература:
прочая старинная литература
5.00