comp_t ac_rw; /* Прочитанные/записанные блоки (не используется) */

comp_t ac_minflt; /* Незначительные отказы страницы (есть лишь в Linux) */

comp_t ac_majflt; /* Значительные отказы страницы

(существует только в Linux) */

comp_t ac_swaps; /* Количество сбросов в файл подкачки

(не используется; существует лишь в Linux) */

u_int32_t ac_exitcode; /* Код завершения процесса */

#define ACCT_COMM 16

char ac_comm[ACCT_COMM+1];

/* Имя команды с NULL в конце (имя последнего запущенного файла) */

char ac_pad[10]; /* Смещение (зарезервировано для будущего использования) */

};

Обратите внимание на следующие особенности данной структуры.

• Типы данных u_int16_t и u_int32_t являются 16- и 32-битными беззнаковыми целыми числами.

• Поле ac_flag — это битовая маска, которая хранит различные события процесса. Биты, которые могут попасть в это поле, приведены в табл. 28.1. Как видите, некоторые из них представлены не во всех реализациях UNIX. Кроме того, некоторые системы предоставляют дополнительные биты для этого поля.

• Поле ac_comm хранит имя последней команды (программного файла), выполненной данным процессом. Ядро записывает это значение при каждом вызове execve(). В некоторых других реализациях UNIX данное поле ограничено восьмью символами.

• Тип comp_t представляет собой число с плавающей запятой. Его значения иногда называют сжатыми тактами системного времени. Это вещественное значение состоит из 3-битной экспоненты с основанием 8- и 13-битной мантиссы; экспонента может представлять фактор в диапазоне от 80 = 1 до 87 (2 097 152). Например, мантисса 125 и экспонента от 1 представляет значение 1000. В листинге 28.2 показана функция comptToLL(), предназначенная для преобразования этого типа в long long. Мы должны использовать тип long long, поскольку 32 бит, выделяемых для unsigned long на платформе x86-32, недостаточно для хранения наибольшего значения, которое может оказаться в поле comp_t ((213 — 1) × 87).

• Три временных поля типа comp_t представляют время в тактах системных часов. Чтобы конвертировать эти значения в секунды, их следует разделить на число, возвращаемое вызовом sysconf(_SC_CLK_TCK).

• Поле ac_exitcode хранит код завершения процесса (описанный в подразделе 26.1.3). В большинстве других реализаций вместо него предоставляется однобайтное поле с именем ac_stat, которое вмещает в себя только сигнал, который завершил процесс (если это был сигнал), и бит, указывающий на то, привел ли этот сигнал к сбрасыванию на диск дампа памяти. Системы, основанные на BSD, не предоставляют ни одно из этих полей.

Таблица 28.1. Битовые значения для поля ac_flag в записях системы учета ресурсов

Бит — Описание

AFORK — Процесс был создан с помощью fork(), но перед завершением не выполнил exec()

ASU — Процесс воспользовался привилегиями администратора

AXSIG — Процесс был завершен по сигналу (отсутствует в некоторых реализациях)

ACORE — Процесс сгенерировал дамп памяти (отсутствует в некоторых реализациях)

Поскольку записи учета ресурсов размещаются в порядке завершения процессов (значение, которое отсутствует в записи), а не их запуска (ac_btime), поскольку именно в этот момент они создаются.

Если в системе произошел сбой, данные учета ресурсов для еще выполняющихся процессов не записываются.

Хранение записей в учетном файле может привести к быстрому исчерпыванию дискового пространства, поэтому для управления операциями учета ресурсов в Linux предоставляется виртуальный файл /proc/sys/kernel/acct. Он содержит три числа, описывающих верхнее ограничение, нижнее ограничение и частоту. Обычно значениями по умолчанию являются 4, 2 и 30. Если учет ресурсов включен и процент свободного дискового пространства опускается за пределы нижнего ограничения, учет приостанавливается. Если позже процент свободного пространства начинает превышать верхнее ограничение, учет возобновляется. Частота указывает на длину интервала (в секундах) между проверками процента свободного пространства на диске.

Пример программы

Программа, представленная в листинге 28.2, выводит отдельные поля записей учетного файла. Ниже приводится сессия командной строки, которая демонстрирует использование этой программы. Начнем с создания нового пустого учетного файла и включения учета ресурсов:

$ su Для включения учета ресурсов нужны повышенные привилегии

Password:

# touch pacct

# ./acct_on pacct Запись об этом процессе первой попадет в учетный файл

Process accounting enabled

# exit Отказываемся от администраторских привилегий

С момента включения системы учета ресурсов было завешено три процесса. С их помощью были выполнены программы acct_on, su и bash. Процесс bash был запущен из su для создания привилегированной сессии командной строки.

Перейти на страницу:

Похожие книги