Интерфейс с программами и подпрограммами, написанными на разных языках программирования. Указатели на функции, страница 3

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

в которой нет параметров.