MS-DOS підтримує дві групи функціональних викликів для роботи з файлами: FCB-функціональні та префіксні (handle) функціональні. Для роботи з функціями першої групи програмі спочатку необхідно створити та ініціалізувати спеціальний блок ‑ блок управління файлом (File Control Block). FCB-функціональні виклики були єдиним засобом для роботи з файлами в MS-DOS в самій молодшій версії 1.0. У наступних версіях MS-DOS з’явилася група префіксних функціональних викликів, що позбавляють програму від необхідності піклуватися про створення та ініціалізації полів FCB. У нинішній час практично всі програми використовують в своїй роботі префіксні функціональні виклики, а FCB-виклики зберігаються для сумісності з попередніми версіями. Turbo C у реалізації бібліотечних функцій використовує префіксні виклики MS-DOS. Далі розглядається тільки префіксний доступ до файлів, тому слово "префіксний" буде вилучатися.
Для спрощення роботи із файлами MS-DOS використовує концепцію відкриття-закриття файлів. Перш ніж використати файл для переносу інформації, його необхідно відкрити. Після того, як програма закінчує роботу з файлом, вона його закриває.
Відкриття файлів виконує функція АН = 3Dh MS-DOS. Пара регістрів DS:DX вказує на ASCIIZ-рядок, що містить специфікацію файлу, що відкривається як регулярний, або ім’я драйверу символьного пристрою. В регістрі AL задається режим відкриття файлу. Значення яке повертається функцією в регістр АХ є ціле число, це префікс (handle) або дескриптор файлу. При всіх наступних операціях доступу до відкритого файлу в MS-DOS для ідентифікації файлу повідомляється тільки префікс.
Закриття регулярного або спеціального символьного файлу (пристрою) виконує функція DOS AH = 3Еh. Значення в ВХ при цьому містить префікс файлу, що закривається.
Для кожного файлу, що відкривається, ОС створює у внутрішній пам’яті спеціальну структурну змінну, яку по аналогії з ОС UNIX далі будемо називати описом відкритого файлу. В цьому описі розміщені прапори режиму доступу до файлу, поточне значення покажчика запису-читання файлу та інша інформація, необхідна ОС для доступу до файлу. Об’єм пам’яті, що резервується під масив описів, ОС визначає під час початкового завантаження по значенню, що задається командою файлу конфігурації CONFIG.SYS FILES=. При її відсутності приймається значення за замовчанням, яке дорівнює 8. Гранично можливе значення дорівнює 255.
Префікси файлів і описи відкритих файлів зв’язані через спеціальний масив типу char, що по аналогії з ОС UNIX далі будемо називати таблицею відкритих файлів програми. Префікс – це індекс або порядковий номер елементу таблиці відкритих файлів. Значення елементу цієї таблиці є порядковим номером в масиві описів відкритих файлів (Мал. 8). Іншими словами, префікс файлу ‑ це непряме посилання на опис відкритого файлу. Перші 5 байт таблиці використовуються для посилань на файли (драйвери) стандартного введення-виведення. Там записується порядковий номер драйверу у спеціальній таблиці драйверів символьних пристроїв або посилання на звичайний регулярний файл, якщо виконується переадресація файлів.
Для кожної програми MS-DOS створює свою унікальну таблицю відкритих файлів, але масив описів використовується тільки один. Сама таблиця відкритих файлів початково зберігається у спеціальній області пам’яті ‑ префіксі сегменту програми (Program Segment Prefix - PSP). Докладно PSP описаний нижче. Розглянемо тільки ті поля PSP, що пов’язані з доступом до файлів. У PSP під таблицю відкритих файлів використовуються 20 байт, починаючи зі зміщення 0018h. Отже, за замовчанням програма має не більш 20 префіксів.
Враховуючи, що перші п’ять префіксів зарезервовані під префікси стандартних файлів, всього може бути виконано 15 операцій відкриття файлів, звичайно, якщо встановлений командою FILES розмір масиву описів відкритих файлів дозволяє це зробити. Граничне число префіксів для програми записується по зміщенню 0032h PSP. По зміщенню 0034h PSP зберігається far-покажчик на місцеположення в пам’яті таблиці відкритих файлів. Спочатку цей покажчик дорівнює значенню PID:0018h, де PID - сегмент, по якому розташовується в пам’яті PSP. На Мал. 8 дана графічна ілюстрація зв’язку таблиці відкритих файлів і масиву описів відкритих файлів. Вважається, що ОС (MS-DOS версії 5.0) завантажена з файлом CONFIG.SYS, що містить рядок “FILES=50” (32h). Програма-предок (програма, що запустила на виконання дану програму) виконала чотири операції відкриття своїх файлів і не закрила їх. Програма-нащадок виконала відкриття двох файлів G:\1 та G:\2.
При запуску програми всі елементи таблиці відкритих файлів, за винятком перших п’яті, зберігають значення FFh. По мірі відкриття файлів номера їхніх описів розташовуються у таблиці відкритих файлів. Якщо, наприклад, префікс відкритого файлу дорівнює 5, це означає, що порядковий номер опису відкритого файлу буде записаний у п’ятому байті таблиці відкритих файлів. Чому він дорівнює залежить від того, як багато відкритих файлів має в даний момент ОС.
Мал. 8. Зв’язок програми з файлами в MS-DOS
Наприклад, на Мал. 8 дане значення дорівнює 09. Це пояснюється тим, що перші п’ять описів зарезервовані під драйвери системи, а програма-предок тримає відкритими 4 файли. Повторне відкриття того ж самого файлу призводить до створення ще одного опису відкритого файлу і записує його номер у таблицю відкритих файлів вже в іншому місці. Іншими словами, повторне відкриття файлу займає і префікс (місце в таблиці відкритих файлів), і опис (місце в внутрішньому масиві описів відкритих файлів). Закриття файлу звільняє префікс, бо у таблиці відкритих файлів записується знов індикатор FFh. Водночас відбувається звільнення елементу у масиві описів відкритого файлу. При відкритті файлу MS-DOS спочатку створює опис відкритого файлу. Після цього вона переглядає таблицю відкритих файлів і, відшукавши перший невикористаний префікс (елемент таблиці FFh), використовує його.
Табл. 5. Наперед визначені
префікси файлів
стандартного введення-виведення
Префікс |
Пристрій, відповідний спеціальному
символьному файлу |
Ім’я пристрою як файлу |
Ім’я потоку |
Переадресація |
0000 |
Стандартний пристрій
введення. За замовчанням відповідає клавіатурі |
CON |
Stdin |
Можлива |
0001 |
Стандартний пристрій
виведення За замовчанням відповідає дисплею. |
CON |
Stdout |
Теж |
0002 |
Стандартний пристрій
виведення помилок. За замовчанням відповідає дисплею |
CON |
Stderr |
Немає |
0003 |
Стандартний додатковий
пристрій За замовчанням відповідає пристрою СОМ1 |
AUX |
Stdaux |
Теж |
0004 |
Стандартний пристрій друку. |
PRN |
Stdprn |
— — |
Примітки:
1.
Вказана можливість переадресації в командному
рядку засобами COMMAND.COM.
2.
Імена потоків ‑ це імена, що використовуються для доступу до
перерахованих файлів через функції стандартної бібліотеки Сі файлового
введення-виведення.
3.
Файли Stdout, Siderr
і Stdprn відкриваються для програми як файли, що допускають
тільки запис, Stdin - тільки читання. Файл Stdaux відкривається як файл, що допускається як читання,
так і запис.
Відкриті програмою-предком файли можуть успадковуватися програмою-нащадком, про що ОС дізнається по байту режиму відкриття файлу. В цьому випадку таблиця відкритих файлів нащадка містить копію саме тих префіксів з PSP предка, котрі відповідають успадкованим файлам. Файли з префіксами 0-4 завжди відкриваються як успадковані нащадком.
![]() |
![]() |
![]() |