Для спрощення взаємодії користувача з ОС слугує спеціальна прикладна програма – оболонка, чи командний процесор. Існує велика кількість різноманітних оболонок для роботи з MS-DOS: COMMAND.COM, NORTON COMMANDER, PCSHELL та ін. Перелічимо основні функції оболонки:
1) введення команди користувача або через рядок, або за системою меню;
2) інтерпретація введеної команди за спеціальними правилами для визначення того, чи задає вона внутрішню або зовнішню команду. Внутрішня команда – це дії, які виконуються підпрограмою, яка входить до складу оболонки, а зовнішня команда – запуск програми на виконання. Оболонка готує всі потрібні для функції EXEC параметри, завантажує внутрішні регістри процесора та викликає переривання 21h. Часто перед цим “розумна” оболонка “згортається”, тобто вся пам’ять, за виключенням мінімально необхідного коду, який залишається резидентно, оголошується вільною і, доступна для використання програмою-нащадком. Після завершення нащадка оболонка знов завантажує свій код, по якому виконуються внутрішні команди. Інший спосіб “згортання” реалізований оболонкою COMMAND.COM. Код внутрішніх команд зосереджений у нерезидентній частині COMMAND.COM. Ця частина при початковому завантаженні MS-DOS завжди міститься в область найстарших адрес пам’яті і при завантаженні великих програм може ними перекриватися. Після завершення роботи програми керування завжди передається резидентній частині COMMAND.COM. В резидентній частині об’ємом близько 4К байт розташовуються програми для обробки переривань 22h, 23h, 24h та спеціальна програма контролю цілісності нерезидентної частини оболонки. Якщо в результаті сумування всіх кодів по модулю 2 нерезидентної частини буде отримане число, яке не співпадає з еталонним значенням, ядро COMMAND.COM організує повторне завантаження нерезидентної частини. Накопичувач і файл, з якого треба виконати завантаження, визначаються по параметру середовища COMSPEC.
В стандартній бібліотеці мови Сі для організації інтерфейсу прикладної програми з оболонкою маємо спеціальну функцію system().
#include
<process.h>
int system( char*com_line )
По змінній середовища COMSPEC відшукує файл COMMAND.COM, розташовує
його в пам’яті та передає йому в якості “хвостовика” командного рядка покажчик
на ASCIIZ-рядок com_line. Якщо com_line=NULL, функція буде лише перевіряти
наявність файлу COMMAND.COM по маршруту, який вказаний змінною середовища
COMSPEC. Якщо com_line=NULL, функція повертає 0 у випадку, коли завантаження та
запуск на виконання вторинної копії оболонки завершуються успіхом. У випадку
помилки повертається –1. Відмітимо, що значення яке повертається не пов’язане з
результатом виконання команди, яка задається у рядку, на яку вказує com_line.
Якщо com_line=NULL і файл COMMAND.COM знайдено за маршрутом, який вказаний
змінною середовища COMSPEC, функція system() повертає ненульове значення, в
протилежному випадку повертається 0.
В якості прикладу застосування system() розглянемо функцію os_shell(), яка реалізує тимчасовий вихід в COMMAND.COM. Повернення в system() відбувається за командою оболонки. В функції os_shell() використана бібліотечна функція getenv(), яка повертає покажчик на рядок, який є значенням специфікованого параметра середовища програми. У даному випадку використовується параметр COMSPEC, значенням якого є специфікація файлу, який містить COMMAND.COM.
/* L5_1.C */
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
void os_shell( void ){
puts( “Вихід в оболонку COMMAND.COM ”
);
puts( “Для повертання наберіть ‘exit’ ”
);
system( getenv( “COMSPEC” ) );
}
Якщо функція os_shell() буде викликана з меж програми, на екрані з’явиться наступне повідомлення:
H:\SOURCE\PART_2>L5_1 -запуск
програми на виконання
Вихід в оболонку COMMAND.COM – вихід з
функції os_shell()
Для повернення наберіть ‘exit’ –
виведення з функції os_shell()
Microsoft(R) MS-DOS(R) Version 5.00 -фірмовий
знак оболонки
(C)Copyright Microsoft
Corp 1981-1991.
H:\SOURCE\PART_2> –
запрошення з вторинної копії
Якщо, працюючи у поточній оболонці, змінити поточний накопичувач та директорій диску і виконати команду exit, то ці нові поточні значення збережуться. Через це рекомендується перед викликом функції os_shell() запам’ятати поточні накопичувач та директорій, а після повертання з os_shell() відновити їх. Перед викликом os_shell() необхідно також зберегти позицію курсору, режим та інші параметри відеоадаптеру і після повертання з функції відновити в колишній стан відеосистему.
Функція system() використовується для:
1) запуску на виконання з меж програми .BAT-файлів;
2) економії зусиль по програмуванню тих функцій, які співпадають з зовнішніми та внутрішніми командами оболонки.
Недоліками використання функції system() є:
1) непродуктивні втрати часу, пов’язані з пошуком і завантаженням вторинної копії COMMAND.COM, причому кожне звертання до функції system() вимагає завантаження вторинної копії COMMAND.COM;
2) нераціональне використання пам’яті комп’ютера, так як під вторинну копію COMMAND.COM вимагається додаткова пам’ять.
![]() |
![]() |
![]() |