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 представляет собой число с плавающей запятой. Его значения иногда называют
• Три временных поля типа 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. Он содержит три числа, описывающих
Программа, представленная в листинге 28.2, выводит отдельные поля записей учетного файла. Ниже приводится сессия командной строки, которая демонстрирует использование этой программы. Начнем с создания нового пустого учетного файла и включения учета ресурсов:
$ su
Password:
# touch pacct
# ./acct_on pacct
Process accounting enabled
# exit
С момента включения системы учета ресурсов было завешено три процесса. С их помощью были выполнены программы acct_on, su и bash. Процесс bash был запущен из su для создания привилегированной сессии командной строки.