- •1. Понятие процесса.
- •2.Типы приложений под Windows
- •3.Описатель экземпляра процесса
- •4.Описатель предыдущего экземпляра процесса
- •5.Командная строка процесса
- •6.Переменные окружения
- •7.Текущие диск и каталог для процесса
- •8.Текущие каталоги для процесса
- •9.Создание процесса - функция CreateProcess
- •9.1. Параметры pszApplicationName и pszCommandLine
- •9.2. Параметры psaProcess, psaThread и blnheritHandles
- •9.3. Параметр fdwCreate
- •9.4. Параметр pvEnvironment
- •9.5.Параметр pszCurDir
- •9.6. Параметр psiStartlnfo
- •9.7. Параметр ppiProclnfo
- •10. Завершение процесса
- •10.1. Возврат управления входной функцией первичного потока
- •10.2. Функция ExitProcess
- •10.3. Функция TerminateProcess
- •10.4.Завершение всех процессов потока
- •11. Порядок завершения процесса
- •14. Дочерние процессы
- •15. Запуск обособленных дочерних процессов
- •16. Порядок выполнения работы
- •17. Контрольные вопросы
15. Запуск обособленных дочерних процессов
Все же чаще приложение все-таки создает другие процессы как обособленные (detached processes) Это значит, что после создания и запуска нового процесса родительскому процессу нет нужды с ним взаимодействовать или ждать, пока тот закончит работу Именно так и действует Explorer: запускает для пользователя новые процессы, а дальше его уже не волнует, что там с ними происходит.
Чтобы обрубить все пуповины, связывающие Explorer c дочерним процессом, ему нужно (вызовом CloseHandle) закрыть свои описатели, связанные с новым процессом и его первичным потоком.
Приведенный ниже фрагмент кода демонстрирует, как, создав процесс, сделать его обособленным
PROCESS_INFORMATION pi;
// Порождение дочернего процесса.
BOOL fSuccess = CreateProcess(..., &pi);
if (fSuccess) {
// Разрешаем системе уничтожить объекты ядра поток и процесс дочернего //процесса сразу по его завершении
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
16. Порядок выполнения работы
-
Создать консольное приложение.
-
Определить и вывести текущий каталог для процесса и для каждого диска, прочитать и вывести переменные окружения процесса. При выводе следует учесть, как хранится блок переменных окружения (каждая переменная отделена символом конца строки, в конце последней переменной два символа конца строки, вывод осуществлять лучше посимвольно).
-
Изменить значение переменной окружения. Вывести переменную окружения на консоль.
-
Изменить текущий каталог.
-
Создать дочерний процесс Child (добавить к рабочей области еще один консольный вид проекта, при создании дочернего процесса отвести ему новую консоль) .
-
В дочернем процессе вывести значение переменной окружения, которую изменили в родительском процессе (для удобства лучше использовать новую переменную окружения, т.е. создать свою).
-
Передать дочернему процессу через командную строку определенные параметры (массив из пяти целых чисел).
-
В дочернем процессе осуществить вывод минимального из переданных параметров из родительского процесса и возврат его, как кода выхода в родительский процесс (для удобства разбора командной строки использовать sscanf.). Родительский процесс ожидает результата (окончания работы дочернего процесса) и выводит его на консоль.
-
Изменить родительский процесс так, чтобы перед дочерним процессом, из него запускалось какое-нибудь стандартное оконное приложение, например Notepad.
-
Переделать запуск дочернего процесса Child, чтобы оно запускалось обособленно убрать передачу массива целых чисел через командную строку.
-
Сделать так, чтобы дескриптор порожденного оконного приложения (Notepad) наследовалась дочерним процессом Child.
-
Дескриптор запущенного стандартного приложения (Notepad) – процесса передать дочернему процессу Child (первый способ – через переменную окружения, второй – через командную строку, подсказка – HANDLE – это длинное целое без знака, для перевода из числа в строку используйте wsprintf, для обратного перевода atol).
-
Дочерний процесс, получая дескриптор приложения закрывает оконное приложение (Notepad). И выводит в консоль сообщение: “Процесс уничтожен!”