Программирование для Linux. Профессиональный подход
Шрифт:
■
statm
. Содержит информацию об использовании памяти процессом, описан в разделе 7.2.6. "Статистика использования процессом памяти". ■
status
. Содержит статистическую информацию о процессе, причем в отформатированном виде; описан в разделе 7 2.7, "Статистика процесса". ■
cpu
. Этот файл появляется только в симметричных многопроцессорных системах и содержит информацию об использовании процессорного времени (пользователями и системой). Из соображений безопасности права доступа к некоторым файлам предоставляются только владельцу процесса
7.2.1. Файл /proc/self
В файловой системе
/proc
есть дополнительный элемент, позволяющий программам находить информацию о своем собственном процессе. Файл /proc/self
является символической ссылкой на каталог, соответствующий текущему процессу. Естественно, содержимое ссылки меняется в зависимости от того, кто к ней обращается. Например, программа, представленная в листинге 7.2, с помощью файла
/proc/self
определяет свой идентификатор процесса (это делается лишь в демонстрационных целях, гораздо проще пользоваться функцией getpid
, описанной в разделе 3.1.1, "Идентификаторы процессов"). Для чтения содержимого символической ссылки вызывается функция readlink
(описана в разделе 8.11, "Функция readlink: чтение символических ссылок"). Листинг 7.2. (get-pid.c) Получение идентификатора процесса из файла
/proc/self
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/* Определение идентификатора вызывающего процесса
на основании символической ссылки /proc/self. */
pid_t get_pid_from_proc_self {
char target[32];
int pid;
/* Чтение содержимого символической ссылки. */
readlink("/proc/self", target, sizeof(target));
/* Адресатом ссылки является каталог, имя которого соответствует
идентификатору процесса. */
sscanf(target, "%d", &pid);
return (pid_t)pid;
}
int main {
printf("/proc/self reports process id %d\n",
(int)get_pid_from_proc_self);
printf("getpid reports process id %d\n", (int)getpid);
return 0;
}
7.2.2. Список аргументов процесса
Файл
cmdline
в файловой системе /proc содержит список аргументов процесса (см. раздел 2.1.1. "Список аргументов"). Этот список представлен одной строкой, в которой аргументы отделяются друг от друга нулевыми символами. Большинство функций работы со строками предполагает, что нулевым символом оканчивается вся строка, поэтому они не смогут правильно обработать
файл cmdline
. В листинге 2.1 приводилась программа, которая отображала переданный ей список аргументов. Теперь, когда мы узнали назначение файлов
cmdline
файловой системы /proc
, можно написать программу, отображающую список аргументов другого процесса. Ее текст показан в листинге 7.3. Поскольку в строке файла cmdline
может содержаться несколько нулевых символов, ее длину нельзя определить с помощью функции strlen
(она лишь подсчитывает число символов, пока не встретится нулевой символ). Приходится полагаться на функцию read
, которая возвращает число прочитанных байтов. Листинг 7.3. (print-arg-list.c) Отображение списка аргументов указанного процесса
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
/* Вывод списка аргументов (по одному в строке) процесса
с заданным идентификатором. */
void print_process_arg_list(pid_t pid) {
int fd;
char filename[24];
char arg_list[1024];
size_t length;
char* next_arg;
/* Определение полного имени файла cmdline
для заданного процесса. */
snprintf(filename, sizeof(filename), "/proc/%d/cmdline",
(int)pid);
/* Чтение содержимого файла. */
fd = open(filename, O_RDONLY);
length = read(fd, arg_list, sizeof(arg_list));
close(fd);
/* Функция read не помещает в конец текста нулевой символ,
поэтому его приходится добавлять отдельно. */
arg_list[length] = '\0';
/* Перебор аргументов. Аргументы отделяются друг от друга
нулевыми символами. */
next_arg = arg_list;
while (next_arg < arg_list + length) {
/* Вывод аргументов. Каждый из них оканчивается нулевым
символом и потому интерпретируется как обычная строка. */
printf("%s\n", next_arg);
/* Переход к следующем аргументу. Поскольку каждый аргумент
заканчивается нулевым символом, функция strlen вычисляет
длину отдельного аргумента, а не всего списка. */
Поделиться с друзьями: