Тема: Програмування. Основні етапи розробки прикладних програм

Вид материалаДокументы

Содержание


Функції управління операційним середовищем
Set comspec=c:\dos\command.com
Процедури управління процесами
Процедури обслуговування переривань
Registers = record
Для застосування процедури Intr необхідно знати деякі тонкості роботи операційної системи і добре знати семантику, параметрів і
Програми, резидентні в пам'яті
Процедури роботи з датою і часом
Процедури і функції перевірки стану диску
Процедура ставить в параметр Verify значення ON, проходить перевірка правильності запису інформації на всі диски, якщо OFF – інф
Процедури і функції роботи з файлами
Інші процедури і функції
Подобный материал:
1   ...   6   7   8   9   10   11   12   13   14
ТЕМА: МОДУЛЬ DOS


Модуль Dos містить ряд підпрограм для роботи з файлами і доступ до засобів операційної системи. Не одна з програм модуля Dos не визначена в стандартному Pascal, тому вони поміщені в окремий модуль.

Щоб використовувати підпрограми, які знаходяться в модулі Dos, його ім'я необхідно вказати в операторі USES на початку програми:

USES Dos;

Процедури і функції модуля Dos можна уявно розбити на наступні групи:
  • Функції управління операційним середовищем.
  • Процедури управління процесами.
  • Процедури обслуговування переривань.
  • Процедури роботи з датою і часом.
  • Процедури і функції перевірки стану диску.
  • Процедури і функції роботи з файлами.
  • Процедури і функції різного призначення.


ФУНКЦІЇ УПРАВЛІННЯ ОПЕРАЦІЙНИМ СЕРЕДОВИЩЕМ

Програма, написана на мові Pascal 7.0 має можливість отримувати від MS-DOS інформацію про оточення (environment). Дані про оточення зберігаються в визначеній області операційної системи і представляють собою набір текстових рядків, в яких описані змінні оточення. Значення одних змінних встановлюється системою по замовчуванню, значення інших задаються користувачем чи прикладною програмою. Кожний опис в області оточення представляє собою рядок виду:

Ім'я = Значення

Ім'я – це ім'я змінної, Значення – текстовий рядок.

Змінні оточення призначені для зберігання визначеної системної інформації, яка необхідна різним прикладним програмам, які використовують її в своїх цілях. Довжина текстового рядка, який визначає змінну оточення, не може перевищувати 128 байт.

Для того щоб встановити змінну оточення, використовується команда операційної системи SET, наприклад:

SET COMSPEC=C:\DOS\COMMAND.COM;

Якщо вказати команду SET без аргументу, то на екрані буде виданий список змінних оточення. В Turbo Pascal міститься три функції для роботи з змінними оточення:

FUNCTION EnvCount: INTEGER;

FUNCTION EnvStr (index: INTEGER): STRING;

FUNCTION GetEnv (EnvVar: STRING): STRING;

Функція EnvCount не має параметрів і повертає загальне число змінних оточення. Функція EnvStr має один параметр і повертає рядок, який містить ім'я і значення змінної, яка відповідає значенню вказаного індексу. Індекс найпершої змінної – 1. якщо вказаний індекс менше 1 чи більше EnvCount, функція EnvStr повертає пустий рядок.

Функція GetEnv дозволяє по імені змінної оточення отримати її значення. При виклику функції вказується один параметр – ім'я змінної оточення.


ПРОЦЕДУРИ УПРАВЛІННЯ ПРОЦЕСАМИ

Використовуючи спеціальні засоби мови Pascal, можна організувати виклик з програми будь-якої іншої програми, яку називають програмою-нащадком. Важливо пам’ятати, що для того, щоб програма-нащадок успішно завантажилася в пам'ять і почала виконуватися, необхідно забезпечити виділення їй потрібного об’єму пам'яті. Так як програма, яка виконується в даний момент, по замовчуванню захоплює всю вільну динамічну пам'ять (кучу) системи, то для завантаження програми-нащадка просто немає місця. Для того щоб виділити для програми-нащадка достатньої кількості вільної пам'яті, необхідно на початку програми вказати за допомогою директиви компілятора $M мінімальний розмір виділеної програмі пам'яті, а якщо в програмі не використовується динамічна пам'ять, то зовсім не виділяти її.

Виклик програми-нащадка відбувається за допомогою процедури

Exec (Path, CmLine: STRING);

Параметр Path – це повний чи скорочений шлях до командного файлу і його ім'я, а CmLine – параметр, в якому можна передати викликаній програмі командний рядок. Якщо виклик програми не відбувся, то це ніяк не відіб’ється на роботі викликаної програми, тобто вона буде вести себе однаково як при успішному, так і при неуспішному виклику. Для того щоб визначити, як пройшов виклик, використовується системна змінна DosError, яка описана в модулі Dos. Зразу після виклику процедури Exec необхідно перевірити значення змінної DosError. Якщо вона рівна 0, то це означає, що виклик пройшов успішно. Не нулеві значення свідчать про помилку. Значення цієї змінної відповідає кодам, виробленими операційною системою, і можуть бути наступними

код помилки

Значення

0

нормальне завершення

2

файл не знайдений

3

шлях не знайдений

4

надто багато відкритих файлів

5

доступ закритий

6

порушена інформація в полях файлу чи в системних областях

8

недостатньо пам'яті

10

несумісні параметри оточення

11

нерозпізнаний формат диску

18

немає більше файлів

Коли викликається програма нащадок, бажано, щоб ця програма виконувалася в оточенні DOS, що відповідає тому оточенні, яке забезпечує операційна система. Однак програма, написана на Турбо Паскалі, звичайно не виконує ці умови. При запуску вона завжди перевизначає деякі переривання для особистих цілей. Тому перед викликом програми нащадка потрібно відновити початкову адресу обробника переривань, а після завершення роботи викликаної програми встановити адресу об робітника Турбо Паскаля. Ці дії виконує процедура Swap Vectors, яка не має параметрів.

Використовуючи механізм виклику незалежних програм, можна створити складні програмні комплекси, в яких програма-диспечер, займає чи не великий об’єм пам'яті, проводить виклик необхідних (в тому числі і системних) програм. В такому випадку може виникнути необхідність передачі інформації з програми-нащадка у викликаючи програму чи навпаки. Нажаль, можливості MS-DOS по здійсненню таких обмінів невеликі. Якщо програма що викликається, написана на мові Турбо Паскаль, то доступ до командного рядка здійснюється за допомогою функцій ParamStr і ParamCount.

Стандартним способом передачі інформації в програму, що викликається, являється процедура HALT, яка має один параметр і через нього передає код завершення, який, в свою чергу, може бути використаним в програмі, що викликається, за допомогою функції

DosExitCode: WORD;

Ця функція повертає значення типу WORD, в молодшому байті якого міститься код повернення, переданий через процедуру завершення, а в старшому – ознака того, як завершилася програма.


ПРОЦЕДУРИ ОБСЛУГОВУВАННЯ ПЕРЕРИВАНЬ

Не дивлячись на те, що Турбо Паскаль має великий набір інструментальних засобів для використання можливостей MS-DOS, в багатьох випадках виникає необхідність прямого звертання до функцій MS-DOS для використання деяких специфічних засобів операційної системи , для організації обміну інформацією в оперативній пам'яті. Для більш повного використання можливостей MS-DOS в модулі DOS знаходиться дві процедури: Intr і MsDos.

В процедурі

Intr (IntNo: BYTE; VAR Regs: REGISTERS);

яка виконує задане програмне переривання, IntNo – номер програмного переривання; REGISTERS являється типом запису, визначеним в модулі DOS наступним чином:

TYPE

REGISTERS = RECORD

CASE INTEGER OF

0: (AX, BX, CX, DX, BP, SI, SI, DS, ES, Flags: WORD);

1: (AL, AH, BL, BH, CL, CH, DL, DH: BYTE);

END;

Поля запису відповідають регістрам процесора.

Процедура

MsDos (VAR Regs: REGISTERS);

виконує виклик функції DOS.

Запис REGISTERS представляє собою набір регістрів процесора, а варіант в цьому записі дозволяє працювати з першими чотирма регістрами чи послідовно, чи з їх старшими і молодшими байтами окремо. Коли виконується процедура Intr, значення полів AX, BX, CX, DX, BP, SI, SI, DS, ES завантажуються у відповідні регістри процесора. Після того як переривання обірвано, склад регістрів процесора завантажується в запис Regs, а склад регістрів прапорів копіюється в поле Flags. Таким чином, можна отримати доступ до результату роботи процедури переривань.

Для застосування процедури Intr необхідно знати деякі тонкості роботи операційної системи і добре знати семантику, параметрів і результатів викликаного переривання.

Переривання номер $21 називається перериванням DOS і об’єднує в собі велику кількість різних функцій.

Результат звернення до процедури MsDos буде той же, що і при зверненні до процедури Intr з номером переривання $21.

Для встановлення нової адреси обробника переривань використовується процедура

SetIntVec (IntNo: BYTE; Vector: POINTER);

де IntNo – номер переривання, яке необхідно перевизначити; Vector – адреса нової процедури обробки переривань. Для того щоб змінити реакцію системи на переривання і визначити обробник користувача, SetIntVec просто змінює запис в системній області Dos, яка називається областю векторів переривань, але при цьому старий вектор, тобто адреса старої процедури обробки переривань, не зберігається. Вона може бути необхідною, щоб через деякий час відновити стару реакцію на переривання чи щоб при виклику переривання спочатку спрацьовував новий обробник, який потім передавав би управління оригінальному (старому) обробнику. Цей принцип використовує більшість резидент них програм. Таким чином, працездатність системи не порушується, коли декілька програм перехвачують одне переривання. Резидентна програма спочатку відпрацьовує сама, потім передає управління іншій програмі і так далі, а в кінці управління передається операційній системі. Тому дуже важливо зберігати адресу старого обробника переривань. Для цього можна використовувати процедуру

GetIntVec (IntNo: BYTE; VAR Vector: POINTER);

яка присвоює параметру-змінній Vector адресу поточного обробника переривань, номер якого заданий в параметрі IntNo.


ПРОГРАМИ, РЕЗИДЕНТНІ В ПАМ'ЯТІ

Існує іще одна процедура, яка відноситься до процедур управління процесами. Це процедура Keep. Її форма така:

Keep (ExitCode: WORD);

Виклик цієї процедури призводить до завершення роботи програми, але при цьому залишає її в пам'яті. Такі програми носять назву програм, резидентних в пам'яті, чи просто резидентних програм. На цьому принципі побудовані драйвери пристроїв і різноманітні сервісні програми. Зробити резидентною можна як програму типу COM, так і програму типу EXE, однак так як із-за відмінностей у внутрішній структурі програми типу COM займають в пам'яті менше місця, то резидентні програми частіше всього реалізують в цій формі. Після того як програма залишилась резидентною в пам'яті, вона передає управління командному процесору, а сама якби „ завмирає”. Для того щоб активізуватися в потрібний момент, програма обов’язково повинна перехватити яке-небудь переривання, наприклад, переривання від клавіатури. Після натиснення потрібної комбінації клавіш програма перехвачує управління і виконує свою задачу.


ПРОЦЕДУРИ РОБОТИ З ДАТОЮ І ЧАСОМ

Модуль DOS представляє програмісту можливість доступу до системних часів і календаря, а також дає можливість змінити дату і час створення файлу. Для доступу до системної дати використовують процедури GetDate і SetDate.

Процедура

GetDate (year, month, day, day_of_week: WORD);

повертає поточну дату, встановлену в системі.

Процедура

SetDate (year, month, day: WORD);

встановлює поточну дату в системі.

Для доступу до системних часів використовуються процедури SetTime і GetTime. Так як і процедури GetDate і SetDate, процедури роботи з системним часом дозволяють просто отримувати і змінювати значення системного часу і можуть використовуватися, наприклад, для визначення тривалості виконання частин програми і програми в цілому.

Процедура

GetTime (VAR hour, minute, second, hund: WORD);

повертає поточний час, встановлений в системі.

Процедура

SetTime (hour, minute, second, hund: WORD);

встановлює поточний час в операційній системі.

Для роботи з датою створення файлу використовується процедура

GetFTime (VAR F: VAR Time: LONGINT);

яка повертає час і дату створення файлу. Змінна F повинна бути файловою змінною. Час і дата повертається в змінній Time в упакованому форматі у вигляді подвійного слова (32 біта), і для їх розпаковки використовується процедура

UnpackTime (Time: LONGINT; VAR DT: DateTime);

Ця процедура перетворює значення, передане в параметрі Time, а запис DT типу DateTime (дата і час).

Щоб змінити дату створення файлу, використовуються дві інші процедури: PackTime i SetFTime.

Процедура

PackTime (VAR T: DateTime; VAR Time: LONGINT);

перетворює запис типу DateTime в подвійне слово, яке використовується процедурою

SetFTime (VAR F; Time: LONGINT);

Ця процедура встановлює дату створення файла.


ПРОЦЕДУРИ І ФУНКЦІЇ ПЕРЕВІРКИ СТАНУ ДИСКУ

Модуль DOS містить ряд функцій і процедур для роботи з диском. З їх допомогою можна здійснювати контроль за наявності вільного простору на диску, контроль правильності запису на диск, а також визначати загальний об’єм диску.

Функція

DiskFree (Drive: BYTE): LONGINT;

повертає кількість вільних байтів на вказаному диску, де Drive – задає номер диску: 0 – поточний диск, тобто той диск, з якого запущена програма; 1 – дисковод А, 2 – дисковод В, 3 – диск С, 4 – диск D і так далі.

Якщо номер диску заданий некоректно, то функція повертає значення 1. таким чином, завжди є можливість проконтролювати правильність виклику функції.

Функція

DiskSize (Drive: BYTE): LONGINT;

повертає загальну кількість байтів на вказаному диску, де Drive задає номер диску. Номер диску задається так само, як і для функції DiskFree.

Процедура GetVerify використовується для отримання значення прапора перевірки DOS, який має назву Verify. Цей прапор слугує для визначення методу запису даних на диск. Якщо Verify знаходиться у включеному стані, тобто дорівнює ON (істинна), то після того, як інформація записана на диск, вона знову читається і порівнюється з оригіналом (звідси його назва Verify – перевіряти). Якщо ж прапор знаходиться у вимкнутому стані, тобто OFF (обман), то інформація записується на диск без перевірки. Існують різні погляди з приводу того, чи варто вмикати даний прапор під час роботи, але практика показує, що вінчестер – досить надійний пристрій і інформація на нього або записується добре, або не записується зовсім. До того ж дана перевірка правильності запису сильно зношує вінчестер і дисководи (адже потрібно записувати, а потім ще і читати) і значно збільшує час запису. Тому вмикати цей прапор необхідно, коли цінна інформація записується з вінчестера на гнучкі диски. Формат процедури наступний:

GetVerify (VAR Verify: BOOLEAN);

Процедура ставить в параметр Verify значення ON, проходить перевірка правильності запису інформації на всі диски, якщо OFF – інформація записується без перевірки.

Як вже було сказано, якщо виникає необхідність переконатися в правильності запису важливої інформації на диск, необхідно включити прапор перевірки. Для цього призначена процедура

SetVerify (Verify: BOOLEAN);

яка встановлює чи відмінює прапор перевірки в залежності від параметру Verify.


ПРОЦЕДУРИ І ФУНКЦІЇ РОБОТИ З ФАЙЛАМИ

Для роботи з файлами в модулі DOS визначенні наступні процедури і функції

Назва

Тип

Призначення

FExpand

FUNCTION

доповнення імені файлу до повного значення (поточний шлях, ім'я, розширення)

FSearch

FUNCTION

пошук файлу в списку каталогів

FindFirst

PROCEDURE

пошук першого файлу з заданим ім'ям і атрибутами

FindNext

PROCEDURE

пошук наступного файлу з заданим ім'ям і атрибутами

FSplit

PROCEDURE

розбиття повного імені файлу на складові частини (шлях, ім'я, розширення)

GetFAttr

PROCEDURE

отримання атрибутів файлу

SetFAttr

PROCEDURE

задання атрибутів файлу

Робота з файлами Турбо Паскаль призводить до необхідності використання термінології і засобів MS-DOS. Іноді виникає необхідність пошуку файлів з однаковим ім'ям, пошуку по шаблону, виділення потрібного файлу із знайденої групи файлів. Процедури FSplit, FExpand, FSearch, FindFirst, FindNext спрощують розв’язання цих задач.

Припустимо, необхідно визначити імена всіх файлів з розширенням .PAS, які знаходяться в визначеному каталозі. Для цього використовують наступні процедури:

FindFirst (Path: STRING; Attr: WORD; VAR S: SearchRec);

FindNext (VAR S: SearchRec);

де Path – шлях і ім'я для пошуку; Attr – задані атрибути файлу; S – змінна типу SearchRec.

Процедура FindFirst шукає перший файл з заданим ім'ям і набором атрибутів у вказаному каталозі. Процедура FindNext шукає наступний файл з атрибутами, заданими при виклику FindFirst, якщо ім'я було задане шаблоном. Обидві ці процедури використовують змінну типу SearchRec для перегляду каталогу. Інформація про кожний файл, знайдена FindFirst чи FindNext, повертається в змінну цього типу. Тип SearchRec описаний в модулі Dos.

Якщо виникає необхідність пошуку в різних каталогах, то використовується FSearch. Функція має формат:

FSearch (Path: PathStr; DirList: STRING): PathStr;

де Path – шлях і ім'я файлу, який необхідно знайти. Тип PathStr описаний в модулі Dos, як рядковий тип. DirList – це список каталогів, в яких буде проводитися пошук. Каталоги в списку повинні бути розділені крапкою з комою аналогічно тому, як це робиться в команді MS-DOS PATH. Пошук завжди починається з поточного каталогу поточного диску. У випадку вдалого пошуку функція повертає рядок, в якому міститься повне ім'я файлу. У випадку невдачі повертається пустий рядок.

Для роботи з іменами файлів використовується також процедура FSplit і функція FExpand. Процедура FSplit дозволяє розбити повний шлях до файлу на три компоненти. Процедура описується наступним чином:

FSplit (Path: PathStr; VAR Dir: DirStr; VAR Name: NameStr; VAR Ext: ExtStr);

В параметрі Path вказується повний шлях до файлу. В змінній Dir повертається шлях без імені файлу.

В змінній Name повертається ім'я файлу без розширення. В змінній Ext буде поміщено розширення.

Функція FExpand виконує дії, протилежні процедурі FSplit. FExpand доповнює ім'я файлу до повного імені. Синтаксис функції наступний:

FExpand (Path: PathStr): PathStr;

Для зміни атрибутів файлу призначенні дві процедури – GetFAttr і SetFAttr. Процедура

GetFAttr (VAR F; VAR Attr: WORD);

повертає атрибути файлу, зв’язаного зі змінною F. Атрибути повертаються в змінну типу WORD. Процедура

SetFAttr (VAR F; Attr: WORD);

встановлює атрибути.


ІНШІ ПРОЦЕДУРИ І ФУНКЦІЇ

В модулі Dos є іще декілька процедур і функцій, не розглянутих нами. Це функція DosVersion і процедури GetCBreak i SetCBreak.

Функція

DosVersion: WORD;

повертає номер версії Dos.

Процедури GetCBreak i SetCBreak призначенні для роботи з змінною MS-DOS BREAK. Ця змінна відповідає за реакцію системи на натискання комбінації клавіш [Ctrl+Break]. Якщо BREAK рівна OFF, тобто вимкнена, то переривання програми здійснюється тільки під час операцій вводу-виводу і виконання програм проходить трохи швидше. Якщо ж BREAK рівна ON, то переривання проходить при будь-яких системних викликах.