3) Динамический вызов программ.
Вызвать из программы (программы-родителя) другую программу можно либо использовав структуру программы с пере подкачкой (OVERLAY), либо запустив из данной программу другую динамически (запуск в run time). С этой целью среди функций прерывания 21h имеются функции 3Fh и 4Bh, соответственно. Эти функции используются во всех языках программирования для обеспечения соответствующих режимов работы.
ンspawn... functions゙ <PROCESS.H>
゚゚゚゚゚゚゚゚゚゚゚゚゚゚゚゚゚゚゚゚
Позволяет программе запускать порождаемый процесс (процесс-ребенок)
spawn...
управление возвращается функции после завершения процесса-ребенка.
Функцию выгодно использовать, когда вы знаете сколько различных параметров будет использовано:
Декларация:
int spawnl (int mode, char *path, char *arg0, ..., NULL);
int spawnle (int mode, char *path, char *arg0, ..., NULL, char *envp[]);
int spawnlp (int mode, char *path, char *arg0, ..., NULL);
int spawnlpe(int mode, char *path, char *arg0, ..., NULL, char *envp[]);
Если вы не знаете сколько различных параметров будут использованы, выгодно использовать функции:
int spawnv (int mode, char *path, char *argv[]);
int spawnve (int mode, char *path, char *argv[], char *envp[]);
int spawnvp (int mode, char *path, char *argv[]);
int spawnvpe(int mode, char *path, char *argv[], char *envp[]);
Замечания:
Функции семейства SPAWN создают и выполняют другие файлы, определяемые как порождаемые процессы. Для их запуска и выполнения необходимо иметь достаточно памяти.
Суффиксы l, v, e, p, добавленные к "SPAWN", определяют некоторые возможности функции SPAWN.
Значения аргументов:
mode | Определяет действия вызывающей функции (parent / / process) выполняемые после вызова spawn....
path ウ Имя файла, содержащего вызываемый процесс
argN ウ Указатель на разные аргументы
argv[N] ウ Указатель на массив указателей
envp ウ Массив знаковых указателей
Параметр MODE может принимать следующие значения:
P_WAIT - «заморозить» процесс-родитель до окончания процесса-ребенка.
P_NIWAIT – противоположен предыдущему.
P_OVERLAY – использовать структуру с переподкачкой.
функции SPAWN рассматривают маршруты в соответствии со стандартом MS DOS.
При вызове функции SPAWN, все открытые ранее файлы остаются открытыми в порожденном процессе.
Возвращаемое значение:
Если порожденный процесс вызывает функцию EXIT с ненулевым аргументом, этот аргумент может быть возвращен процессу-родителю.
При нормальном завершении возвращается нулевое значение.
В случае неправильного завершения процесса-ребенка функция spawn... возвращает -1, и устанавливает в "errno" одно из следующих значений:
E2BIG Слишком длинный список аргументов
EINVAL Неверный аргумент
ENOENT Маршрут или имя файла не найдены
ENOEXEC Неверный формат файла EXE.
ENOMEM Недостаточно памяти
Возьожность использования в:
ノ DOS ム UNIX ム Windows ム ANSI C ム C++ Only サ
В языке PASCAL и подобных ему языках используется возможность работы с использованием OVERLAY. С этой целью создается специальный библиотечный файл TURBO.TTL на рабочем диске. Это потребует соответствующего дискового пространста, выделяемого в библиотечном файле через параметр $O. При этом использование дальней модели вызова ($F) ОБЯЗАТЕЛЬНО. Создание программ, использующих OVERLAY, происходит в следующей последовательности:
1) Выделить главную программу и модули оверлея. Все эти модули оформляются как обычные выполняемые (.EXE) программы за одним исключением – в ветвях оверлея нельзя использовать процедуры обработки прерываний, которые нодо устанавливать в главной прграмме.
2) В главной программе директивой
$O <name1>, <name2>,….
Необходимо описать все модули оверлея из библиотеки стандартных модулей, если такие имеютя. Например, DOS. Однако все остальные (CRT, Graph, Printer и т.д.) должны бать описаны в главной программе. Например:
Program MAIN;
Uses
CRT, DOS, Graph, Overlay, UnitA, UnitB;
; ниже идет модули оверлея
{$O DOS}
{$O UnitA}
{$O UnitB}
3) Пред первым обращением к оверлейному модулю необходимо установить процедуру инициализации
оверлея
OvrInt <имя файла с с оверлейной частью программы>
4) В начале главного модуля и каждого оверлейного модуля необходимы директивы компилятора {$O+} и {$F+}. Необходимо установить следующие опции компилятора:
OPTIONS/ COMPIKE/ FORCE FOR CALLS
И
OPTIONS/ COMPILE/ OVERLAY ALLOWED
установить в состояние ON.
При компиляции все оверлейные программы попадают в специальный файл с иметем главной программы и с расширением .OVR.
В качестве примера опишем программу, в которой из главной программы вызываются последовательно модули оверлея:
Program Overlay_demo;
{текст главной программы надо поместить в файл MAIN.PAS}
{$F+, O+}
USES Overlay, UnitA, UnitB;
{$O UnitA}
{$O UnitB}
BEGIN
OvrInit (‘MAIN.OVR’);
SubA
END.
UNIT UnitA;
{текст модуля поместить в файл UNITA.PAS}
{$F+,O+}
INTERFASE
Uses UnitB;
Procedure SubA;
IMPLEMENTATION
PROCEDURE SubA;
Const
St = ‘Работает модуль ’ ;
BEGIN
Writeln (St,’A’);
SubB (St)
END;
END.
UNIT UnitB;
{текст модуля поместить в файл UNITB.PAS}
{$F+,$O+}
INTERFASE
Procedure SubB (S:snring);
IMPLEMENTSTION
PROCEDURE SubB;
BEGIN
Writeln (S,’B’);
END;
END.
Обычно буфер, куда вводятся для исполнения все модули оверлея, автоматически устанавливаются ОС по длине наибольшего из них.
Но программист может заказать такой модуль сам процедурой
OVRSETBUF (<длина>)
и отдать его после работы процедурой
OVRGETBUF
в которой нет параметров.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.