Чтение онлайн

ЖАНРЫ

Программирование для 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 вычисляет

длину отдельного аргумента, а не всего списка. */

Поделиться с друзьями: