Дочерние процессы и их запуск



Имеется возможность запустить программу (дочернюю) из уже запущенной (родительской). Один из способов – это использование функции system . Она может выполнить любую команду MS-DOS или любую программу, а также пакетный файл. При использовании этой функции должен быть доступен файл command.com . Функция system возвращает код завершения, но по нему нельзя сделать вывод о том, как была выполнена запускаемая программа. Если в качестве аргумента функции будет передано имя несуществующей программы, на экране появится сообщение: Bad command or file name. Другая возможности запустить программу - использовать функции spawn и exec. Функция spawn и ее разновидности запускают программу как дочерний процесс.

После завершения дочерней программы управление будет передано программе, которая запустила родительскую программу. Семейство функций spawn обеспечивает запуск дочерней программы, передавая ей родительскую или специально сформированную среду.

Таблица 3. Параметры функции SPAWN.

Параметр Описание
P_WAIT Выполнение родительской программы задерживается до завершения дочерней программы
P_NOWAIT Родительская программа продолжает выполнение сразу после запуска дочерней программы. Этот параметр имеет смысл только для мультизадачных операционных систем
P_OVERLAY Загружает программу как оверлей и передает ей управление. Этот режим соответствует функции exec в том смысле, что родительская программа не получит управления после завершения дочерней

 

Среда процесса, наследование среды

При загрузке программы DOS, кроме программного сегмента, создает для нее еще и сегмент окружения (environment). Сегмент окружения содержит ASCIIZ-строки, задающие значения некоторых глобальных переменных, они доступны командным файлам и - через PSP - программам. Набор строк окружения заканчивается пустой ASCIIZ-строкой (нулем). Обычно в первую (до строк вызова) часть порождаемой программы копируется содержимое окружения программы-родителя.

 При запуске программы из программы суффиксe функции SPAWN указывает на то, чтоодна или несколько строк окружения будут переданы потомку через массив указателей на строки. Каждая такая строка должна иметь вид ПЕРЕМЕННАЯ_ОКРУЖЕНИЯ=ЗНАЧЕНИЕ. Последний указатель в массиве должен быть NULL. Если первый элемент массива является NULL, то процесс – потомок сохраняет то же самое окружение, что и потомок родитель.

Каждая программа получает статическую копию первоначального окружения. Поэтому любые изменения, производимые в окружении, будут действительны только для порождаемых процессов, и будут утеряны при возврате в порождающий процесс.

 

 

Системные управляющие блоки DOS (таблица векторной связи)

Операционная система MS-DOS содержит векторную таблицу связи основных управляющих блоков. Зная адрес этой таблицы можно получить доступ к внутренним структурам данных операционной системы. Вслед за областью данных BIOS , расположенной в начале оперативной памяти, расположена область данных MS-DOS. Здесь находятся внутренние переменные и структуры данных MS-DOS. Основные структуры данных организованы в виде дерева. Корнем является векторная таблица связи, которая содержит адреса всех остальных структур: список блоков управления памятью (MCB ), список блоков управления устройствами MS-DOS , таблицу файлов, дисковые буферы и т. д.

В векторной таблице связи есть и другая полезная информация, открывающая доступ практически ко всем внутренним структурам данных операционной системы. Можно, например, получить доступ ко всем резидентным и загружаемым драйверам операционной системы. Можно узнать, какие в системе установлены дисковые устройства и каковы их характеристики. Для получения адреса векторной таблицы связи можно воспользоваться недокументированной внутренней функцией 52h прерывания 21h.

Смещение байт Размер байт Описание
-2 2 Сегмент первого блока памяти MCB
0 4 Указатель на первый блок управления устройствами MS-DOS (MS-DOS DCB)
4 4 Указатель на таблицу файлов MS-DOS
8 4 Указатель на драйвер CLOCK$ , установленный в файле config.sys или резидентный
12 4 Указатель на драйвер CON , установленный в файле config.sys или резидентный
16 2 Максимальный размер блока (в байтах) для устройства, выполняющего передачу данных отдельными блоками
18 4 Указатель на структуру, описывающую дисковые буферы
22 4 Указатель на массив информации об устройствах
26 4 Указатель на таблицу FCB
30 2 Размер таблицы FCB
32 1 Число устройств, выполняющих передачу данных отдельными блоками
33 1 Значение LASTDRIVE в файле config.sys (по умолчанию равно 5)
34 ? Начало драйвера NUL. Этот драйвер всегда первый в списке драйверов MS-DOS
Одно из полей векторной таблицы связи содержит указатель на начало Массива Текущих Каталогов. Каждый элемент массива - Структура Текущего Каталога (CDS) сохраняет информацию о текущем каталоге на логическом диске.
Размер Данные
67 ASCIIZ-строка, содержащая полный путь к текущему каталогу.
2 Слово признаков
1 Номер DPB, для этого диска
1 Зарезервировано
2 номер 1-го кластера родительского каталога
2 номер элемента в родительском каталоге
2 номер 1-го кластер текущего каталога
4 Зарезервировано

Массив Текущих Каталогов представляет собой именно массив, а не список - его элементы располагаются в смежных областях памяти один за другим.

MS-DOS создает системную таблицу файлов SFT (System File Table ) и помещает ее адрес в поле file_tab векторной таблицы связи. В этой таблице для каждого открытого файла хранится такая информация, как количество файловых идентификаторов, связанных с данным файлом, режим открытия файла (чтение, запись и т. д.), слово информации об устройстве, указатель на заголовок драйвера, обслуживающего данное устройство, элемент дескриптора файла (дата, время, имя файла, номер начального кластера, распределенного файлу), номер последнего прочитанного кластера и т. д. Каждая таблица SFT содержит указатель на следующую таблицу, а также количество управляющих блоков файлов DFCB.

Таблица 6. Формат таблицы SFT.

Смещение, байт Размер, байт Имя поля Описние
0 4 next Указатель на следующую таблицу файлов SFT
4 2 file_count Количество файлов, описанных в этой таблице с помощью блоков DFCB

Блоки DFCB (по одному для каждого файла) расположены в конце таблицы SFT и имеют следующий формат:

Смещение, байт Размер, байт Описание
0 2 Количество идентификаторов, связанных с данным файлом
2 1 Режим доступа к файлу, заданный при открытии файла
3 2 Зарезервировано
5 2 Информация IOCTL , полученная для устройства, на котором расположен этот файл.
7 4 Указатель на драйвер, обслуживающий устройство, содержащее файл
11 2 Номер первого кластера, распределенного файлу
13 2 Время последнего изменения файла в упакованном формате
15 2 Дата последнего изменения файла в упакованном формате
17 4 Размер файла в байтах
21 4 Текущее смещение внутри файла в байтах
25 2 Зарезервировано
27 2 Зарезервировано
29 3 Зарезервировано
32 1 Зарезервировано
33 11 Имя файла в формате FCB
44 2 Зарезервировано
46 2 Адрес блока PSP программы, открывшей файл
48 2 Зарезервировано
50 2 Номер только что прочитанного кластера
52 4 Зарезервировано

 

Завершение процесса

С помощью прерывания INT 20h или функции 0 прерывания INT 21h обычно завершают свою работу com-программы. Учтите, что перед завершением работы программы регистр CS должен указывать на PSP.

Более удобна функция 4Ch прерывания INT 21h которую можно использовать с любым содержимым регистров.

Последний способ рекомендуется для повсеместного использования. Он позволяет передать родительской программе код завершения.

Если ваша программа запустила дочернюю программу и та завершилась, передав код возврата, то родительская программа может определить этот код с помощью функции 4Dh прерывания INT 21h . Эта функция возвращает код в регистре AX.

Программа, написанная на языке С, может завершаться с помощью оператора return в функции main или с помощью функции exit в любом месте программы. При этом также возможна передача кода возврата.

Существуют еще способы завершения работы программы, при которых программа (или ее часть) остается резидентной в памяти. Это вызов прерывания INT 27h или функции 31h прерывания INT 21h .

 

 


Дата добавления: 2019-02-13; просмотров: 277; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!