РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА I.1. Файловая подсистема ОС (продолжение) 1.11. Дисциплина доступа к подкаталогам и файлам Доступ к файлу становится возможен после выполнения фун- кции его открытия (OPEN). Аналогично, для поиска и обработ- ки файлов в каталоге должен быть открыт файл-каталог,а зна- чит, и все ФК пути доступа к нему, начиная с корневого. При открытии файла ему присваивается индивидуальный сис- темный номер, который хранится в поле FCB.FILENUM и исполь- зуется при последующих вызовах для открытия подкаталогов, установки текущего устройства и контроля повторных открытий. При открытии самого файла требуется указывать в том же поле номер его отчего ФК. Открытие цепочки файлов на носителе начинается с откры- тия корневого каталога. Оно выполняется явно, вызовом OPEN, или неявно, указанием специального кода в качестве отчего каталога для первого открываемого файла пути. При явном от- крытии корневого каталога указываемое в FCB имя файла игно- рируется, и дополнительно передается логический номер уст- ройства. Открытие последующих подкаталогов сводится к по- следовательному занесению их имен в FCB.NAME и выполнению вызовов OPEN. Если использовать для открытия цепочки файлов один и тот же буфер FCB, то номер файла будет передаваться от вызова к вызову через FCB.FILENUM автоматически. Например, открытию файла в цепочке 'C:FK1\FK2\FILE1' со- ответствует такая последовательность действий: FCB.LOGDR := 3 ; задать номер устройства C: OPEN (FCB,dev) ; открыть у-во: => FCB.FILENUM=N1 FCB.NAME := 'FK1' OPEN (FCB) ; => FCB.FILENUM=N2 FCB.NAME := 'FK2' OPEN (FCB) ; => FCB.FILENUM=N3 FCB.NAME := 'FILE1' OPEN (FCB) ; => FCB.FILENUM=N4 По окончании работы все файлы должны быть закрыты. От- крытые файлы цепочки доступа можно закрыть по очереди, на- чиная с последнего и кончая КФК, или все сразу. Закрывает файлы вызов CLOSE. 1.12. Префиксное открытие Явно указывать и открывать весь путь каждого терминаль- ного файла, как это формально требуется, неудобно. В ДОС есть общий механизм префиксного открытия, позволяющий ими- тировать повторное открытие некоторого уже открытого подпу- ти (префикса), сократив объем действий. Префиксное открытие задается специальным битом в коде номера отчего ФК FILENUM. Пусть, в продолжение примера выше, требуется открыть файл 'C:FK1\FK2\FILE2', причем префикс 'C:FK1\FK2\' уже от- крыт. Для этого достаточно выполнить следующие действия: FCB.FILENUM := N3+рrеf ; Код ФК 'C:FK1\FK2\' префиксно FCB.NAME := 'FILE2' OPEN (FCB) ; неявно открывает пред.цепочку Префиксным должно быть только первое открытие в явной части пути. Однако, наиболее принят способ префиксирования относи- тельно текущего каталога. 1.13. Текущее устройство и текущий каталог Текущим является единственное устройство, для обращения к которому можно не указывать явно его имя (номер). Текущее устройство назначено всегда: в начале работы системы это то устройство, с которого проведена загрузка, в процессе рабо- ты пользователь может переназначать его. На каждом (не только текущем) устройстве можно назначить его текущий каталог, для доступа к которому необязательно использовать его префикс (системный номер): достаточно ука- зания номера устройства. Текущий каталог удобно использо- вать в качестве префикса для открытия файлов. Текущий каталог устройства всегда открыт и позволяет, таким образом, держать устройство активным. Текущий каталог может быть сброшен: в этом случае, при отсутствии других открытых файлов, устройство становится пассивным. Обращение к текущему каталогу пассивного устройства означает доступ к корневому каталогу и его открытие. Каталог, перед назначением его текущим, должен быть ка- ким-нибудь образом открыт (исключение делается для корнево- го, который ДОС умеет открывать сама); на вход S_DEFDEV пе- редается его системный номер, а сам он остается открытым на все время его использования в качестве текущего. Старый те- кущий каталог данного устройства закрывается тем же вызовом неявно, и закрывать его явно, с помощью CLOSE, не следует. При загрузке системы текущие каталоги устройств не назнача- ются. Если текущий каталог назначен, то при открытии файлов в качестве номера отчего ФК в FCB.FILENUM можно указывать FF (текущий каталог) или FF-n (его n-й предок), что соответ- ствует n подъемам '/' в префиксе пути. Заведомо большое n (но не больше 3F) приведет при подъеме к корневому катало- гу: так можно задавать адресацию относительно корня. Адресация относительно текущего каталога является част- ным случаем префиксной: префикс-бит в коде ФК установлен. Для определения текущего каталога любого устройства, а также номера текущего устройства служит вызов G_DEFDEV. Использование относительной адресации придает программе независимость от каталога, файлы из которого она обрабаты- вает. 1.14. Мультидоступ к файлам. Ранги доступа ДОС допускает повторное открытие файла и одновременный обмен с ним через два различных FCB (например, асинхронную обработку файлов несколькими пользователями). Во избежание конфликтов при одновременной записи в файл или потери до- стоверности при чтении из модифицируемого файла на способы мультидоступа наложены серьезные ограничения. Допускаются либо мультидоступ на чтение данных из файла с запретом за- писи всем пользователям, либо монодоступ с правом записи. Это правило, однако, обходится для ФК: изменения в нем даже при мультидоступе происходят централизованно, поэтому опасности дезинтеграции данных нет. ФК открывется всегда на мультичтение, явная запись в него при этом невозможна,а из- менения, производимые системой в каталоге, записью не счи- таются. Таким образом, несколько пользователей могут одно- временно работать с каталогом со всей полнотой возможностей. При открытии файла учитывается также состояние защиты от записи, наложенные на файл или его надкаталоги, а также тип требуемого доступа. Вся совокупность признаков, разрешающих открытие файла, регулируется несколькими т.н. рангами дос- тупа: 1. При открытии файла указывается тип открытия R: R = 0: только на чтение, 1: с правом записи. Открытие производится лишь если тип открытия файла соот- ветствует рангам доступа к нему. 2. Атрибут защиты файла от изменения (уничтожения) P: P = 0: изменение разрешено, 1: изменение запрещено. Хранится в старшем бите поля FCB.STATUS записи файла в каталоге. Устанавливается в 0 при создании файла. Изме- няется вызовом S_STATUS. 3. Допустимость открытия файла с правом записи контролирует ранг доступа A, определяемый с учетом рангов защиты фай- ла и его каталогов: Aфайла = Aфк оr P. Ранг A хранится в памяти ДОС для каждого открытого файла. A = 0: открытие на запись и уничтожение разрешены, 1: открытие на запись и уничтожение запрещены. 4. Допустимость записи в открытый файл - ранг W, который хранится в старшем бите поля FCB.STATUS пользовательско- го блока FCB и контролируется при записи в файл: W = 1: запись разрешена, 0: запись запрещена. Ранг W по смыслу равнозначен R, указанному при открытии файла, и устанавливается равным ему при выполнении усло- вия допустимости открытия. 5. Допустимость повторного открытия файла - ранг доступа S: S = 1: повторное открытие запрещено, 0: повторное открытие разрешено только на чтение S по смыслу равнозначен W и R, определенным при первом открытии файла, но хранится не в пользовательском FCB, а в рабочей области ДОС для каждого открытого файла и ис- пользуется при повторном открытии файла для проверки совместимости нового типа доступа с повторным открытием. Устанавливается равным R при первом открытии файла. Окончательно, условия открытия выглядят так: файл или ФК защищены не защищены (A=1) (A=0) первое на зп (R=1): ошибка открыть, S:=1 открытие на чт (R=0): открыть, S:=0 открыть, S:=0 повторное на зп (R=1) ошибка ошибка открытие на чт (R=0) S=1: ошибка ошибка S=0: открыть открыть 1.15. Модель файлов Файл в ДОС представляется последовательностью записей фиксированного размера. Длина файла (максимальная доступная позиция) ограничена величиной 256 * 2^16 байтов = размер блока * макс.номер блока (2 байта). Ограничений по памяти, связанных с размером файла, фор- мально нет даже для малоемких носителей: файл может быть "дырявым", а память под нужные записи выделяется по мере надобности. Размер ФК не превосходит 256 записей. Возможны следующие способы задания обработки пустот: - заполнять нулями в файле (при записи) и в памяти (при чтении); - игнорировать пустоты (из незаписанных мест будет читать- ся мусор); - останавливаться по чтению пустот (работает с точностью до целых блоков). Метод доступа к файлам - последовательно-прямой: можно задать позицию начала обмена в байтах или записях и прочи- тать/записать последовательность байтов или записей. Возможен контроль невыхода за установленную верхнюю гра- ницу памяти при чтении (контроль HIMEM). Размер записи файла фиксируется при создании в поле FCB.RECLEN и затем обычно не меняется. Текущая позиция за- носится в FCB.POSITN и меняется автоматически по ходу обме- на или явно пользователем. Число записей для обмена задает- ся в FCB.RECIO. 1.16. Атрибуты файлов Файл имеет ряд атрибутов, описывающих его дополнительные свойства. Атрибуты могут принимать битовые значения 0 (вы- ключен) и 1(включен) и хранятся в байте состояния файла (FCB.STATUS) в виде шкалы битов 'PBuuTSHD': P - защита файла от записи и уничтожения; проверяется при уничтожении файла и открытии его на запись; D - тип файла: 0-файл данных, 1-каталог; проверяется при открытии, уничтожении и поиске файла, устанавливается при создании; H - скрытый файл; S - системный файл; B - файл-копия (для хранения невыводимых в каталоге копий файлов); T - атрибут PRG-файлов: прекращение ввода команд из CMD- файла при запуске данного PRG-файла; u - дополнительные атрибуты, которые можно использовать в других целях. При поиске файла в каталоге можно накладывать ограниче- ния на значения атрибутов (см. SEARCH): файлы, не удовлет- воряющие ограничениям, находиться не будут. Это можно ис- пользовать для сокрытия в каталоге "лишних" файлов или для быстрого поиска файлов специального назначения - в дополне- ние к неявной типизации с помощью расширений.