Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



Функция CreateProcess — основная функция для управления процессами в Win32. Она создает процесс с одним потоком. Так как процесс требует наличия кода, в вызове функции CreateProcess необходимо указывать имя исполняемого файла программы.

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

Функция CreateProcess для обеспечения гибкости и мощности имеет десять па­раметров. На первый случай можно просто использовать их значения по умолчанию.

В указанную при вызове структуру возвращаются два дескриптора: для процесса и для потока. Функция CreateProcess создаст новый процесс с первичным потоком. В примерах программ оба дескриптора, когда потребность в них исчезает, всегда аккуратно закрываются во избежание утечки ресурсов. На­пример, если перед закрытием дескриптора потока не завершить этот поток, функция CloseHandle лишь удалит ссылку на поток.

BOOL CreateProcess (LPCTSTR lpszImageName, LPTSTR

lpszCommandLine, LPSECURITY_ATTRIBUTES lpsaProcess,

LPSECURITY_ATTRIBUTES lpsaThread, BOOL fInheritHandles,

DWORD fdwCreate, LPVOID lpvEnvironment, LPCTSTR lpszCurDir,

LPSTARTUPINFO lpsiStartInfo, LPPROCESS_INFORMATION lppiProcInfo);

Возвращаемое значение: TRUE только в случае, если процесс и поток были успешно созданы.

Параметры

lpszImageName и lpszCommandLine (последний имеет тип LPTSTR, а не LPCTSTR) указывают исполняемую программу и параметры командной строки, как показано в следующем разделе.

lpsaProcess и lpsaThread указывают на структуры атрибутов безопасности про­цесса и потока. В случае если их значение NULL, используются атрибуты по умолчанию.

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

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

• CREATE_SUSPENDED — первичный поток находится в состоянии ожидания и бу­дет запущен только после вызова функции ResumeThread.

• DETACHED_PROCESS и CREATE_NEW_CONSOLE — взаимоисключающие флаги; нельзя установить оба сразу. Первый флаг создает процесс без консоли, а вто­рой предоставляет консоль новому процессу. Если ни один из этих флагов не установлен, процесс наследует консоль родителя.

• CREATE_NEW_PROCESS_GROUP определяет новый процесс как корневой для но­вой группы процессов. Если процессы группы совместно используют одну кон­соль, то все они получают сигнал управления консолью (<Ctrl+C > или < Ctrl+Break >).

Некоторые флаги управляют приоритетом потоков нового процесса. Пока просто будем использовать приоритет родительского процесса (не указывая ничего) или значение NORMAL_PRIORITY_CLASS.

lpvEnvironment указывает блок окружения для нового процесса. Если этот пара­метр имеет значение null, то используется окружение родительского процесса. Блок окружения содержит строки имен и значений, такие как путь поиска.

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

lpsiStartInfo указывает вид основного окна программы и дескрипторы стан­дартных устройств для нового процесса. Используйте информацию родителя, полу­ченную вызовом функции GetStartupInfo. Перед вызовом функции CreateProcess структуру STARTUPINFO можно также обнулить, а затем для указания стандартных де­скрипторов ввода, вывода и сообщений об ошибках установить стандартные значения соответствующих полей (hStdIn, hStdOut и hStdErr) структуры STARTUPINFO. Для того чтобы это сработало, присвойте другому полю структуры STARTUPINFO — dwFlags — значение STARTF_USESTDHANDLES, а затем установите все дескрипторы, необходимые новому процессу. Убедитесь, что дескрипторы могут быть унаследованы и в функции CreateProcess установлены флаги fInheritProcess.

Параметр lppiProcInfo определяет структуру, в которую будут помещены деск­рипторы и идентификаторы для созданных процесса и потока. Структура PROCESS_INFORMATION определена так:

typedef struct _PROCESS_INFORMATION { HANDLE hProcess;

HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId;

} PROCESS_INFORMATION;

Для чего же процессам и потокам нужны дескрипторы в дополнение к идентифи­каторам (ID)? В течение всего времени существования объекта его идентификатор уникален для всех процессов, тогда как данный процесс может иметь несколько деск­рипторов, содержащих различные атрибуты, например права доступа. Поэтому одним функциям управления процессами требуются идентификаторы, а другим — дескрип­торы. Кроме того, дескриптор процесса необходим функциям общего назначения, ра­бота которых основана на использовании дескрипторов. Приме­чание: как и в случае дескрипторов файлов, дескрипторы процессов и потоков должны быть закрыты после использования.

Дополнительное примечание, новый процесс получает переменные окружения, рабочий каталог и другую информацию при вызове функции CreateProcess. Как только этот вы­зов выполнен, любые изменения в родительском процессе уже не влияют на дочерний процесс. Например, родитель после вызова функции CreateProcess может изменить свой рабочий каталог, но рабочий каталог дочернего процесса не изменится, если только сам дочерний процесс не изменит его. Эти два процесса полностью независимы.





Дата публикования: 2015-11-01; Прочитано: 604 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...