Зачастую желательно не задавать жестко в коде программы предположения насчет системных ограничений и возможностей, поскольку от реализации к реализации, а также в отдельно взятой реализации они могут варьироваться: либо во время выполнения программы, либо между файловыми системами. В результате в SUSv3 указываются методы, при использовании которых реализация может извещать об установленных ограничениях и поддерживаемых возможностях. Для большинства ограничений в SUSv3 указываются минимальные значения, которые должны поддерживаться всеми реализациями. Кроме того, каждая реализация может известить о свойственных ей ограничениях и возможностях в ходе компиляции (через константы, определенные в заголовочных файлах
Основные вопросы, рассмотренные в данной главе, также освещаются в главе 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), и спецификации для
11.1. Попробуйте запустить программу из листинга 11.1 в других реализациях UNIX, если у вас есть такая возможность.
11.2. Попробуйте запустить программу из листинга 11.2 в других файловых системах.
12. Информация о системе и процессе
В этой главе рассматриваются способы получения различной информации о системе и процессе. Основное внимание в ней уделяется файловой системе /proc. Кроме того, дается описание системного вызова uname(), используемого для извлечения различных идентификаторов системы.
В старых реализациях UNIX не было простого способа выполнить интроспективный анализ атрибутов ядра для получения ответов на следующие вопросы.
• Сколько процессов запущено в системе и кто их владельцы?
• Какие файлы открыты процессом?
• Какие файлы в данный момент заблокированы и какие процессы удерживают эти блокировки?
• Какие сокеты используются в системе?
В некоторых старых реализациях эта проблема решалась тем, что привилегированным программам разрешалось анализировать структуры данных в ядре. Но такой подход имел несколько недостатков. В частности, он требовал специализированных знаний о структурах данных ядра, а эти структуры могли претерпевать изменения от одной версии ядра к другой, в силу чего программы, зависящие от этих структур, нужно было переделывать.
Чтобы предоставить более легкий доступ к информации ядра, во многих современных реализациях UNIX предусмотрена виртуальная файловая система /proc. Она находится в каталоге /proc и содержит различные файлы, предоставляющие информацию о ядре. Процессам можно беспрепятственно считывать эту информацию и в некоторых случаях вносить в нее изменения, используя обычные системные вызовы файлового ввода-вывода. Файловая система /proc называется виртуальной потому, что содержащиеся в ней файлы и подкаталоги не находятся на диске. Вместо этого ядро создает их на лету по мере обращения к ним процессов.
В этом разделе дается обзор файловой системы /proc. Конкретные /proc-файлы описываются в последующих главах. Хотя файловая система /proc предоставляется многими реализациями UNIX, ее описание в SUSv3 отсутствует, и все подробности, указанные в данной книге, относятся к операционной системе Linux.