[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Что же делает вызов open(2) ?
Открытие существующего файла означает, что:
. файл ищется в иерархии директорий для получения inode-номера.
. проверяются права доступа файла
. в таблице дескрипторов размещается новый дескриптор.
. проверяются системные структуры файлов и, если необходимо,
размещается новое поле.
. если необходимо, размещается новая структура информации о файле.
. соединяется с подходящим драйвером устройства.
. возвращается файловый дескриптор (индекс в таблице файловых
дескрипторов).
Информация об открытых файлах хранится в ядре системы UNIX. Таблица
файловых дескрипторов, размещенная в пользовательской области
процесса, содержит указатели на системные структуры файлов. Файловый
дескриптор, значение, возвращаемое open(2), находится в диапазоне от 0
до SFNOLIM-1 и является индексом в таблице файловых дескрипторов.
Системные файловые структуры содержат информацию о конкретном вызове
open(2). Для каждого вызова open(2) выделяется собственная структура.
В структуре содержится следующая информация:
. текущее позиция в файле. Это положение изменяется на
прочитанное/записанное количество байт. Кроме того, позицию в файле
можно установить явно вызовом lseek(2).
. копия флагов открытия. Эти флаги передаются вторым аргументом
open(2).
. счетчик ссылок. Это число различных файловых дескрипторов из одной
или различных пользовательских областей, которые совместно
используют данную системную структуру.
. указатель на структуру информации о файле.
Структура информации о файле имеет следующее строение:
. inode-номер и номер устройства.
. пользовательский идентификатор и идентификатор группы владельца
файла.
. счетчик ссылок - количество системных файловых структур,
ссылающихся на данную структуру.
. связи - количество записей в директориях, указывающих на данный
файл.
. тип файла - обычный, директория и пр.
. права доступа данного файла.
. размер файла в байтах.
. список номеров блоков для блоков данных на диске.