Тот факт, что содержимое этого файла со временем изменяется, обуславливает следующий подход использования /proc-файлов: когда они состоят из множества записей, их нужно анализировать с оглядкой и искать в таком случае совпадение со строкой, содержащей конкретное строковое значение (например, PPid:), а не работать с файлом по логическим номерам строк.
В табл. 12.1 перечислены другие файлы, которые находятся в каждом каталоге /proc/PID.
Таблица 12.1. Отдельные файлы в каждом каталоге /proc/PID
Файл — Описание (атрибут процесса)
cmdline — Аргументы командной строки с \0 в качестве разделителя
cwd — Символьная ссылка на текущий рабочий каталог
environ — Пары вида ИМЯ=значение списка переменных среды с \0 в качестве разделителя
exe — Символьная ссылка на выполняемый файл
fd — Каталог, содержащий символьные ссылки на файлы, открытые данным процессом
maps — Отображения памяти
mem — Виртуальная память процесса (для получения правильного смещения перед вводом-выводом следует воспользоваться функцией lseek())
mounts — Точки монтирования для данного процесса
root — Символьная ссылка на корневой каталог
status — Различная информация (например, идентификаторы процесса, полномочия, использование памяти, сигналы)
task — Содержит по одному подкаталогу для каждого потока в процессе (Linux 2.6)
Каталог /proc/PID/fd
В каталоге /proc/PID/fd содержится по одной символьной ссылке для каждого файлового дескриптора, открытого процессом. Каждая из этих символьных ссылок имеет название, совпадающее с номером дескриптора, например, /proc/1968/fd/1 является символьной ссылкой на стандартный вывод процесса 1968. Дополнительные сведения можно найти в разделе 5.11.
Для удобства, любой процесс может обратиться к своему собственному каталогу /proc/PID с помощью символьной ссылки /proc/self.
Потоки: каталог /proc/PID/task
В Linux 2.4 для соответствующей поддержки модели потоков POSIX добавилось понятие групп потоков. Поскольку некоторые атрибуты для потоков в группе потоков различаются, в Linux 2.4 добавился подкаталог task, расположенный в каталоге /proc/PID. Для каждого имеющегося в процессе потока ядро предоставляет подкаталог /proc/PID/task/TID, где TID является идентификатором потока. (То же самое число будет возвращено при вызове в потоке функции gettid().)
В подкаталоге /proc/PID/task/TID находится набор файлов и каталогов, в точности похожий на расположенный в каталоге /proc/PID. Поскольку потоки совместно используют большое количество атрибутов, множество сведений в этих файлах одинаково для каждого из потоков процесса. Но там, где есть для этого смысл, в таких файлах для каждого из потоков показывается различная информация. Например, в файлах /proc/PID/task/TID/status для группы потоков некоторые поля State, Pid, SigPnd, SigBlk, CapInh, CapPrm, CapEff и CapBnd могут иметь для каждого потока различные значения.
12.1.2. Системная информация, находящаяся в /proc
Доступ к информации, распространяющейся на всю систему, предоставляется в различных файлах и подкаталогах, находящихся в /proc. Некоторые из них показаны на рис. 12.1.
Рис. 12.1.
Файлы, упомянутые на рис. 12.1, рассматриваются в разных местах данной книги. Основное назначение подкаталогов, перечисленных на рис. 12.1, сведено в табл. 12.2.
Таблица 12.2. Назначение отдельных подкаталогов, находящихся в /proc
Каталог — Информация, предоставляемая файлами в этом каталоге
/proc — Различная системная информация
/proc/net — Информация состояния сети и сокетов
/proc/sys/fs — Настройки, относящиеся к файловым системам
/proc/sys/kernel — Различные общие настройки ядра
/proc/sys/net — Настройки сети и сокетов
/proc/sys/vm — Настройки, касающиеся управления памятью
/proc/sysvipc — Информация об IPC-объектах System V
12.1.3 Доступ к файлам, находящимся в /proc
Доступ к файлам, находящимся в /proc, зачастую осуществляется с использованием сценариев оболочки (большинство /proc-файлов, хранящих множество значений, могут быть легко проанализированы с помощью таких языков написания сценариев, как Python или Perl). Например, содержимое /proc-файла можно изменить и просмотреть, используя следующие команды оболочки:
# echo 100000 > /proc/sys/kernel/pid_max
# cat /proc/sys/kernel/pid_max
100000
Доступ к /proc-файлам также может быть получен из программы с использованием обычных системных вызовов файлового ввода-вывода. При доступе к этим файлам применяются кое-какие ограничения.
• Некоторые /proc-файлы предназначены только для чтения, то есть они существуют лишь для отображения информации о ядре и не могут использоваться для ее изменения. Это справедливо для большинства файлов в каталогах /proc/PID.