Выбрать главу

Дополнительная информация

Основные вопросы, рассмотренные в данной главе, также освещаются в главе 2 издания [Stevens & Rago, 2005] и в главе 2 издания [Gallmeister, 1995]. В книге [Lewine, 1991] также предоставляются более ценные (хотя и немного устаревшие) основы. Некоторую информацию о возможностях POSIX с замечаниями относительно glibc и подробностями, касающимися Linux, можно найти по адресу http://people.redhat.com/drepper/posix-option-groups.html. К данной теме также имеют отношение следующие страницы руководства по Linux: sysconf(3), pathconf(3), feature_test_macros(7), posixoptions(7) и standards(7).

Лучшими источниками информации (хотя иногда и сложными для понимания) являются соответствующие части SUSv3, особенно глава 2 из Base Definitions (XBD), и спецификации для <unistd.h>, <limits.h>, sysconf() и fpathconf(). Руководство по использованию SUSv3 предоставляется в издании [Josey, 2004].

11.7. Упражнения

11.1. Попробуйте запустить программу из листинга 11.1 в других реализациях UNIX, если у вас есть такая возможность.

11.2. Попробуйте запустить программу из листинга 11.2 в других файловых системах.

12. Информация о системе и процессе

В этой главе рассматриваются способы получения различной информации о системе и процессе. Основное внимание в ней уделяется файловой системе /proc. Кроме того, дается описание системного вызова uname(), используемого для извлечения различных идентификаторов системы.

12.1. Файловая система /proc

В старых реализациях UNIX не было простого способа выполнить интроспективный анализ атрибутов ядра для получения ответов на следующие вопросы.

• Сколько процессов запущено в системе и кто их владельцы?

• Какие файлы открыты процессом?

• Какие файлы в данный момент заблокированы и какие процессы удерживают эти блокировки?

• Какие сокеты используются в системе?

В некоторых старых реализациях эта проблема решалась тем, что привилегированным программам разрешалось анализировать структуры данных в ядре. Но такой подход имел несколько недостатков. В частности, он требовал специализированных знаний о структурах данных ядра, а эти структуры могли претерпевать изменения от одной версии ядра к другой, в силу чего программы, зависящие от этих структур, нужно было переделывать.

Чтобы предоставить более легкий доступ к информации ядра, во многих современных реализациях UNIX предусмотрена виртуальная файловая система /proc. Она находится в каталоге /proc и содержит различные файлы, предоставляющие информацию о ядре. Процессам можно беспрепятственно считывать эту информацию и в некоторых случаях вносить в нее изменения, используя обычные системные вызовы файлового ввода-вывода. Файловая система /proc называется виртуальной потому, что содержащиеся в ней файлы и подкаталоги не находятся на диске. Вместо этого ядро создает их на лету по мере обращения к ним процессов.

В этом разделе дается обзор файловой системы /proc. Конкретные /proc-файлы описываются в последующих главах. Хотя файловая система /proc предоставляется многими реализациями UNIX, ее описание в SUSv3 отсутствует, и все подробности, указанные в данной книге, относятся к операционной системе Linux.

12.1.1. Получение информации о процессе: /proc/PID

Для каждого процесса в системе ядро предоставляет соответствующий каталог по имени /proc/PID, где PID является идентификатором процесса. Внутри этого каталога находятся различные файлы и подкаталоги, содержащие информацию о процессе. Например, просмотрев файлы в каталоге /proc/1, можно получить информацию о процессе init, идентификатор которого всегда имеет значение 1.

Среди файлов в каждом каталоге /proc/PID есть файл по имени status, предоставляющий множество данных о процессе:

$ cat /proc/1/status

Name: init Имя исполняемого файла

State: S (sleeping) Состояние процесса

Tgid: 1 ID группы потоков (обычный PID, getpid())

Pid: 1 Фактически ID потока (gettid())

полную версию книги