Мегаобучалка Главная | О нас | Обратная связь


ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 21



2015-12-13 425 Обсуждений (0)
ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 21 0.00 из 5.00 0 оценок




1. Объекты ядра.

2. Создание процессов. Параметры функции CreateProcess().

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

Новый процесс в Windows создается вызовом функции createProcess,

которая имеет следующий прототип:

BOOL CreateProcess(

LPCTSTR lpApplicationName, // имя исполняемого модуля

LPTSTR lpCoramandLine, // командная строка

LPSECURITY_ATTRIBUTES lpProcessAttributes, // защита процесса

LPSECURITY_ATTRIBUTES lpThreadAttributes, // защита потока

BOOL bInheritHandles, // признак наследования дескриптора

DWORD dwCreationFlags, // флаги создания процесса

LPVOID lpEnvironment, // блок новой среды окружения

LPCTSTR lpCurrentDirectory, // текущий каталог

LPSTARTUPINFO lpStartUpInfo, // вид главного окна

LPPROCESS_INFORMATION lpProcessInformation // информация о

// процессе );

Функция CreateProcess возвращает TRUE, если процесс и поток были

успешно созданы, или FALSE при неудаче. Процесс, который создает новый

процесс, называется родительским процессом (parent process). Новый же

процесс, который создается другим процессом, называется дочерним

процессом (child process). Опишем назначение некоторых параметров функции

CreateProcess. Первый параметр lpApplicationName определяет строку с именем

исполняемого файла, который имеет тип ехе и будет запускаться при создании

нового процесса. Эта строка должна заканчиваться нулем и содержать полный

путь к исполняемому файлу. Возвращаемое значение:

При использовании параметра lpCommandLine система для запуска

нового процесса осуществляет поиск требуемого ехе-файла в следующей

последовательности каталогов:

- каталог, из которого запущено приложение;

- текущий каталог родительского процесса;

- системный каталог Windows;

- каталог Windows;

- каталоги, которые перечислены в переменной PATH среды окружения.

Параметры lpProcessAttributes и lpThreadAttributes указывают на структуры

атрибутов безопасности процесса и потока. В случае если их значение NULL,

используются атрибуты по умолчанию.

Параметр bInheritHandles определяет, должен ли новый процесс наследовать

копии открытых наследуемых дескрипторов (файлов, отображений и т.д.)

процесса, вызвавшего функцию. Унаследованные дескрипторы имеют те же

атрибуты, что и их оригиналы.

В параметре dwCreationFlags можно объединять несколько флагов.

• CREATE_SUSPENDED — первичный поток находится в состоянии ожидания

и будет запущен только после вызова функции ResumeThread.

• DETACHED_PROCESS и CREATE_NEW_CONSOLE —

взаимоисключающие флаги; нельзя установить оба сразу. Первый флаг создает

процесс без консоли, а второй предоставляет консоль новому процессу. Если ни

один из этих флагов не установлен, процесс наследует консоль родителя.

• CREATE_NEW_PROCESS_GROUP определяет новый процесс как корневой

для новой группы процессов. Если процессы группы совместно используют

одну консоль, то все они получают сигнал управления консолью.

Некоторые флаги управляют приоритетом потоков нового процесса. Пока

просто будем использовать приоритет родительского процесса (не указывая

ничего) или значение NORMAL_PRIORITY_CLASS.

lpEnvironment указывает блок окружения для нового процесса. Если пара-

метр имеет значение NULL, то используется окружение родительского

процесса.

lpCurrentDirectory определяет диск и каталог для нового процесса. Если его

значение NULL, то будет использован рабочий каталог родительского

процесса.

lpStartUpInfo указывает вид основного окна программы и дескрипторы стан-

дартных устройств для нового процесса.

Параметр lpProcessInformation определяет структуру, в которую будут

помещены дескрипторы и идентификаторы для созданных процесса и потока.

Структура PROCESS_INFORMATION определена так:

typedef struct _PROCESS_INFORMATION { HANDLE hProcess;

HANDLE hThread; DWORD dwProcessID; DWORD dwThreadID;

} PROCESS_INFORMATION;

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

Процесс может завершить свою работу вызовом функции ExitProcess,

которая имеет следующий прототип:

VOID ExitProcess(

UINT uExitCode // код возврата из процесса );

При вызове функции ExitProcess завершаются все потоки процесса с кодом

возврата, который является параметром этой функции. При выполнении этой

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

процессом, сообщение DLL_PROCESS_DETACH, которое говорит о том, что

динамическую библиотеку необходимо отсоединить от процесса.

Один процесс может быть завершен другим при помощи вызова функции

TerminateProcess, которая имеет следующий прототип:

BOOL TerminateProcess(

HANDLE hProcess, // дескриптор процесса

UINT uExitCode // код возврата );

Если функция TerminateProcess выполнилась успешно, то она возвращает

ненулевое значение, иначе - FALSE. Функция TerminateProcess завершает

работу процесса, но нe ocвoбождает все ресурсы, принадлежащие этому

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

Идентификация процессов

Процесс может получить идентификатор и дескриптор нового дочернего

процесса из структуры PROCESS_INFORMATION. Закрытие дескриптора

дочернего процесса уничтожает только возможность доступа к нему

родительского процесса. Для получения описания текущего процесса используется пара функций.

HANDLE GetCurrentProcess (VOID)

DWORD GetCurrentProcessId (VOID)

Функция GetCurrentProcess в действительности возвращает

псевдодескриптор, который не может быть унаследован. Это значение

используется в случаях, когда процессу требуется собственный дескриптор.

Создавайте настоящий дескриптор процесса из его ID, используя в вызове

функции OpenProcess значение, возвращенное функцией

GetCurrentProcessId.

HANDLE OpenProcess ( DWORD fdwAccess, BOOL fInherit,

DWORD IDProcess)

Возвращаемое значение: дескриптор процесса или NULL в случае

ошибки.

Параметр fdwAccess определяет параметры доступа процесса к дескриптору.

Приведем некоторые из его возможных значений.

• Флаг SYNCHRONIZE разрешает другим процессам ждать завершения

этого процесса, используя функции ожидания

• PROCESS_ALL_ACCESS — установлены все флаги доступа.

• Флаг PROCESS_TERMINATE делает возможным завершение процесса

вызовом функции TerminateProcess.

• Флаг PROCESS_QUERY_INFORMATION разрешает использовать

дескриптор функциями GetExitCodeProcess и GetPriorityClass для получения

информации о процессе.

И наконец, выполняющийся процесс может определить имя своего

загрузочного файла с помощью функции GetModuleFileName, используя в

качестве параметра hModule указатель NULL. Вызов этой функции из

динамической библиотеки возвратит имя файла DLL, а не файла .ЕХЕ,

используемого библиотекой.

Копирование дескрипторов

Родительскому и дочернему процессам может потребоваться различный

доступ к объекту, который определяется дескриптором, унаследованным

дочерним процессом. Также процессу может потребоваться его настоящий

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

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

необходимыми правами доступа и видом наследования. Ниже представлена

функция для копирования дескрипторов.

BOOL DuplicateHandle(

HANDLE hSourceProcessHandle, // дескриптор процесса источника

HANDLE hSourceHandle, // исходный дескриптор

HANDLE hTargetProcessHandle, // дескриптор процесса приемника

LPHANDLE lpTargetHandle, // дубликат исходного дескриптора

DWORD dwDesiredAccess, // флаги доступа к объекту

BOOL bInheritHandle, // наследование дескриптора

DWORD dwOptions // дополнительные необязательные флаги

);

Если функция DuplicateHandle завершается успешно, то она возвращает

ненулевое значение. В противном случае эта функция возвращает значение

FALSE.

 

3. Завершение всех процессов в задании.

 



2015-12-13 425 Обсуждений (0)
ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 21 0.00 из 5.00 0 оценок









Обсуждение в статье: ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 21

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (425)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)