Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 79
Текст из файла (страница 79)
8.2. Интерфейс доступа пользователя к файлам 337 даться для несколько иных целей. Если файлу не назначено прав на выполнение группой и флаг зд16 является установленным, то над этим файлом разрешается производить принудительную блокировку файла/записи 115). Флаг навязчивости зйс)су нужен также для выполняемых файлов и используется для запроса к ядру системы на сохранение «образа» программы в области свопинга (см, раздел 13.2.4) после завершения ее выполнения'. Системные администраторы часто устанавливают флаг з11с1у для наиболее часто выполняемых программ, увеличивая тем самым производительность системы.
В большинстве современных реализаций 1)1ч1Х все завершенные программы по возможности оставляются в области свопинга (при этом используется одна из вариаций алгоритма замены недавно испольэоважиейся информацией — ЕИ)), таким образом, для них не требуется применение флага навязчивости. Флаги зд16 и з0с1у применяются немного по-другому для каталогов, Если флаг зйс)су установлен, а в каталог можно производить запись, то процесс обладает правом на удаление или изменение файла в этом каталоге только в том случае, если его действительный 1ЛР совпадает с идентификатором владельца файла или каталога, а также тогда, когда процесс обладает правами на запись файла.
Если флаг з11с1у сброшен, то удалять или переименовывать файлы, находящиеся в каталоге, может любой процесс, обладающий правом на запись в этот каталог. При создании файла значение действительного ЫР наследуется от создавшего его процесса. Идентификатор С1Р владельца при этом может иметь только два значения. В системе 3ЧВЗ файл наследовал действительный С1Р от своего создателя.
В 4,3ВВР наследуется С1Р каталога, в котором файл был создан. В системе БЧК4 для выбора значения идентификатора используется флаг зд16 родительского каталога. Если этот флаг был установлен для каталога, то при создании новых файлов значение С1Р наследуется от родительского каталога. Когда флаг зд16 сброшен, новые файлы получают С1Р от своего создателя. Для манипуляций с атрибутами файлов в 11М1Х предлагается специальный набор системных вызовов. Входным аргументом всех этих функций является полное имя файла.
Вызовы 11п1 и цп11п)с применяются соответственно для создания и удаления жесткой связи. Ядро удаляет файл только в том случае, если на него не остается ни одной ссылки и никто им не пользуется в текущий момент. Системный вызов цйшез изменяет временные метки доступа и изменения для файла. Функция сйотеп переназначает идентификаторы пользователя и группы владельца. Вызов сйшо6 изменяет права и флаги режимов файла.
' Система старается не занимать память, в которую была загружена программа. При повторном запуске такую программу не нужно считывать с диска — до«таз очно передать на нее управление. — Прим. ред, 338 Глава 8. Базовые элементы и интерфейс файловой системы 8.2.3. Дескрипторы файлов Перед использованием файла процесс должен сначала открыть его для чте- ния или записи. Системный вызов орел имеет следующий синтаксис: ггг - преп грагл, ог1ао. шогге); где рагп — это абсолютное или относительное полное имя файла, а люде указывает на права, ассоциируемые с файлом при его создании.
Флаги, передаваемые при помощи переменной ойад, указывают на необходимость открытия файла после его создания на чтение (геааг), запись (ивгге), чтение-запись (геад-гепге), добавление (аррелсг) и т. д. Для создания файла также применяется системный вызов сгеаг, который эквивалентен вызову ореп с флагами О ггйОйьг', О ЕЯЕАТ и О ТкОИЕ. Каждый процесс имеет маску создания файлов, определенную по умолчанию, являющуюся битовой маской прав, не предоставляемых создаваемым файлам. Когда пользователь указывает параметр глоде для функции преп или сгеаг, пользователь обнуляет разряды, указанные в маске по умолчанию.
Для изменения маски, принятой по умолчанию, используется системный вызов цглай. Пользователь может перезаписать маску уже после создания файла при помощи сйгпод. При вызове функции орел ядро создает обьект огпкрытого файла, соответствующий количеству открытий для этого файла. Ядро также выделяет дескриптор файла, являющийся ссылкой на объект открытого файла. Возвращаемой переменной вызова орел и является дескриптор открываемого файла. Пользователь может открывать один и тот же файл неоднократно, его могут одновременно открывать и сразу несколько пользователей. В последнем случае ядро системы создаст новые объекты открытого файла и дескрипторы. Дескриптор файла является обьекглом, относящимся к определенному првггессу.
Один и тот же дескриптор для двух процессов часто ссылается на разные файлы. Процесс использует дескрипторы для передачи ввода-вывода системным вызовам, таким как геад или гнпге. Ядру дескрипторы нужны для быстрого нахождения объекта открытого файла, а также других структур данных, ассоциируемых с этим файлом. Это дает возможность ядру производить различные действия, такие как анализ полного имени или управление доступом, на стадии вызова функции ореп, а не при проведении каждой операции ввода-вывода.
Открытые файлы можно закрыть либо при помодгя системного вызова с!озе, либо это произойдет автоматически при завергпении работы процесса. Каждый дескриптор связан с независимым сеансом работы с файлом. Ассоциируемый с этим дескриптором объект открытого файла содержит контекст сеанса. Контекст включает в себя режимы, при которых было произведено открытие файла, а также указатель смещения, показывающий точ- 8.2. Интерфейс доступа пользователя к файлам 339 ку начала следующей операции чтения или записи. В системе 13Х1Х по умолчанию доступ к файлам осуществляется последовательно. После открытия файла пользователем ядро производит инициализацию указателя смещения в значение «ноль».
В дальнейшем каждая операция чтения или записи увеличит значение указателя на количество переданных данных. Поддержка указателя смещения для объекта открытого файла позволяет ядру изолировать различные сеансы доступа к файлу друг от друга (рис. 8.2). Если два процесса открывают один и тот же файл', то операция чтения или записи одним из этих процессов приведет к сдвигу только собственного указателя смещения. Значение второго указателя при этом не изменяется.
Такой подход обеспечивает прозрачное совместное использование файла несколькими процессами одновременно. Эта возможность системы должна применяться с осторожностью. В большинстве случаев доступ к одному и тому же файлу несколькими процессами влечет необходимость применения для его блокировки технологии синхронизации, описанной в разделе 8.2.6. Файл Даокрипторы Открытии файлов объактов файлов Рио.
6.2. Файл, открытый дважды Процесс может дублировать дескрипторы при помощи системных вызовов двр или двр2. Эти функции создают новый дескриптор, указывающий на один и тот же объект открытого файла и, следовательно, разделяющий один н тот же сеанс (рис 8.3). Системный вызов Гоги производит создание копий всех файловых дескрипторов родительского процесса и передает их потомку.
После возврата из Гоги предок и потомок разделяют между собой одинаковый набор открытых файлов. Эта форма совместного использования имеет фундаментальные отличия от нескольких экземпляров открытия файла, Так как два дескриптора разделяют между собой один и тот же сеанс работы, они оба видят файл одинаково и используют тождественный указатель смещения. Операция увеличения указателя смещения, произведенная над одним из дескрипторов, приведет к тому, что эти изменения (как правило) тут же окажутся видны и в остальных.
' Или если пронесс открывает один и тот же файл двыкды. 340 Глава 8. Базовые элементы и интерфейс файловой системы Дескрипторы файлов Рис. 8.3. Дескриптор, продублированный при помощи функций оцр, оир2 или 1огх Процесс может передавать дескриптор файла любому другому процессу, при этом достигается эффект передачи ссылки на объект открытого файла. Ядро производит копирование дескриптора в первую свободную ячейку таблицы дескрипторов получателя.
В результате оба дескриптора разделяют ме. жду собой один и тот же объект и, следовательно, обладают единым указателем смешения. Обычно процесс, посылаюший дескриптор, закрывает его после завершения операции отправки. Это не приводит к закрытию файла— даже в том случае, если адресат так и не получил дескриптор, поскольку ядро системы удерживает второй дескриптор во время проведения передачи. Интерфейс передачи дескрипторов зависит от конкретной реализации (ЛЧ1Х. В системе 5Ъ'К4 для этой цели используется вызов юс1! с командой 1 5Е)тОЕО, при этом передача осуществляется через 5ТКЕАМ5 (см.
раздел 17.9). Процессы получают дескриптор при помощи команды 1 КЕСЧЕО вызова !ос!!. В системе 4.3ВВР для передачи дескрипторов применяются вызовы зеп4юхд и гесуп1зд и соединение сокетов, осуществленное между двумя процессами (см. раздел 17.10.3). Передача дескрипторов может применяться в реализациях некоторых типов сетевых приложений. Один процесс, называемый сервером соединения, может настроить сетевое соединение для клиентского процесса, и затем передать дескриптор, представляющий соединение, этому клиенту обратно.
В разделе 11.10 будет описана переносимость файловых систем в 4.4В5Р, используюших развитие этой концепции. 8.2.4. Файловый ввод-вывод Система (ЛЧ1Х позволяет осуществлять как произвольный, так и последовательный доступ к файлам. По умолчанию применяется последовательный доступ.
Ядро поддерживает указатель смещения файла, который при первом открытии этого файла инициализируется в ноль. Он указывает на текущую позицию в файле, с которой будет производиться следующая операция ввода- вывода. Каждый раз, когда процесс считывает или записывает данные в файл, ядро сдвигает указатель на величину переданного объема данных. Произвольный доступ к файлу достигается с помощью системного вызова (зее!г, которому передается необходимое значение указателя смешения.