Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП. Часть 2. Контрольная работа 2.doc
Скачиваний:
93
Добавлен:
01.04.2014
Размер:
190.98 Кб
Скачать
    1. Создание процессов.

Самый распространенный способ начала процесса — это осуществить запуск приложения в Проводнике (Explorer), либо в меню Пуск (Start), либо набрав название программы в командной строке. Новые процессы обычно создаются:

  1. При запуске операционной системы,

  2. При появлении запроса на создание процесса — происходит в случае, если работающий процесс создает новый процесс.

Кроме того, Win32 API содержит несколько функций, которые можно использовать для создания и управления процессами.

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

Создание нового процесса

void main()

{

   STARTUPINFO si;

   PROCESS_INFORMATION pi;

   ZeroMemory(&si, sizeof(si));

   si.cb=sizeof(si)

   if (CreateProcess("c:\\windows\\system32\\calc.exe", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) {

      CloseHandle(pi.hThread);

      CloseHandle(pi.hProcess);

   }

}

Эта программа создаёт новый процесс с нормальным классом приоритета, выполняющего программу calc.exe - калькулятор. Если создание процесса завершилось без ошибок, CreateProcess возвращает значение "истина", указатель на структуру PROCESS_INFORMATION (переменная pi) заполняется информацией о вновь созданном процессе: идентификаторе и описателях процесса и первичного потока. Если родительскому процессу не требуется взаимодействовать с порождённым процессом он должен закрыть описатели процесса и потока, вызвав CloseHandle.

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

Процесс можно завершить четырьмя способами:

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

  2. Один из потоков процесса вызывает функцию ExitProcess (что также является предпочтительным).

  3. Поток другого процесса вызывает функцию TerminateProcess (нежелательный, аварийный способ).

  4. Все потоки процесса завершаются по своей воле. Но это случается очень редко.

Рекомендуется проектировать приложение так, чтобы его процесс завершался только после возврата управления функцией первичного потока. Это единственный способ, который гарантирует корректную очистку всех ресурсов, принадлежащих первичному потоку. При таком завершении, например любые объекты C++, созданные данным потоком, уничтожаются соответствующими деструкторами. Система освобождает память, которую занимал стек потока, и устанавливает код завершения процесса, который и возвращает входная функция.

Можно также завершить процесс, вызвав функцию ExitProcess. В справочных материалах MSDN этот способ указан как рекомендуемый. В то же время Дж. Рихтер указывает, что возможны ситуации, когда при данном способе завершения процесса не для всех объектов C++ будут вызваны деструкторы. Конечно, операционная система и в этом случае корректно очистит все ресурсы, выделенные процессу. Но при этом весьма вероятна утечка памяти или других ресурсов.

Вызов функции TerminateProcess тоже завершает процесс. Главное отличие этой функции от ExitProcess заключается в том, что ее может вызвать любой поток и завершить при этом любой процесс. Функцией TerminateProcess следует пользоваться лишь в крайнем случае, когда иным способом завершить процесс не удаётся. Процесс не получает абсолютно никаких уведомлений, что он завершается, и приложение не может выполнить очистку ресурсов или предотвратить свое неожиданное завершение. При этом теряются все данные, которые программа не успела переписать из памяти на диск. Но операционная система и в этом случае освобождает все принадлежавшие процессу ресурсы.

Четвёртая ситуация может возникнуть, если все потоки вызвали ExitThread или они были закрыты другими потоками, вызвавшими функцию TerminateThread. Обнаружив, что в процессе нет исполняющихся потоков, операционная система немедленно завершает его. Код завершения процесса приравнивается к коду завершения последнего потока.

В случае завершения процесса системой выполняются следующие действия.

Выполнение всех потоков в процессе прекращается.

Все User-объекты и GDI-объекты, созданные процессом, уничтожаются, а объекты ядра закрываются, если их не использует другой процесс.

Объект ядра «процесс» переходит в свободное, или незанятое (signaled), состояние.

Счётчик пользователей объекта ядра «процесс» уменьшается на единицу.