Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа по процессам full.doc
Скачиваний:
7
Добавлен:
19.12.2018
Размер:
375.3 Кб
Скачать

15. Запуск обособленных дочерних процессов

Все же чаще приложение все-таки создает другие процессы как обособленные (detached processes) Это значит, что после создания и запуска нового процесса родительскому процессу нет нужды с ним взаимодействовать или ждать, пока тот закончит работу Именно так и действует Explorer: запускает для пользователя новые процессы, а дальше его уже не волнует, что там с ними происходит.

Чтобы обрубить все пуповины, связывающие Explorer c дочерним процессом, ему нужно (вызовом CloseHandle) закрыть свои описатели, связанные с новым процессом и его первичным потоком.

Приведенный ниже фрагмент кода демонстрирует, как, создав процесс, сделать его обособленным

PROCESS_INFORMATION pi;

// Порождение дочернего процесса.

BOOL fSuccess = CreateProcess(..., &pi);

if (fSuccess) {

   // Разрешаем системе уничтожить объекты ядра поток и процесс дочернего //процесса сразу по его завершении

   CloseHandle(pi.hThread);

   CloseHandle(pi.hProcess);

}

16. Порядок выполнения работы

  1. Создать консольное приложение.

  2. Определить и вывести текущий каталог для процесса и для каждого диска, прочитать и вывести переменные окружения процесса. При выводе следует учесть, как хранится блок переменных окружения (каждая переменная отделена символом конца строки, в конце последней переменной два символа конца строки, вывод осуществлять лучше посимвольно).

  3. Изменить значение переменной окружения. Вывести переменную окружения на консоль.

  4. Изменить текущий каталог.

  5. Создать дочерний процесс Child (добавить к рабочей области еще один консольный вид проекта, при создании дочернего процесса отвести ему новую консоль) .

  6. В дочернем процессе вывести значение переменной окружения, которую изменили в родительском процессе (для удобства лучше использовать новую переменную окружения, т.е. создать свою).

  7. Передать дочернему процессу через командную строку определенные параметры (массив из пяти целых чисел).

  8. В дочернем процессе осуществить вывод минимального из переданных параметров из родительского процесса и возврат его, как кода выхода в родительский процесс (для удобства разбора командной строки использовать sscanf.). Родительский процесс ожидает результата (окончания работы дочернего процесса) и выводит его на консоль.

  9. Изменить родительский процесс так, чтобы перед дочерним процессом, из него запускалось какое-нибудь стандартное оконное приложение, например Notepad.

  10. Переделать запуск дочернего процесса Child, чтобы оно запускалось обособленно убрать передачу массива целых чисел через командную строку.

  11. Сделать так, чтобы дескриптор порожденного оконного приложения (Notepad) наследовалась дочерним процессом Child.

  12. Дескриптор запущенного стандартного приложения (Notepad) – процесса передать дочернему процессу Child (первый способ – через переменную окружения, второй – через командную строку, подсказка – HANDLE – это длинное целое без знака, для перевода из числа в строку используйте wsprintf, для обратного перевода atol).

  13. Дочерний процесс, получая дескриптор приложения закрывает оконное приложение (Notepad). И выводит в консоль сообщение: “Процесс уничтожен!”