Составители:
Рубрика:
CreateProcessWithLogonW позволяют при необходимости загрузить про-
филь пользователя и, кроме того, функция CreateProcessWithLogonW сама
получает маркер пользователя по известному учетному имени, домену и
паролю:
#include <windows.h>
#define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL
int main( void )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset( &si, 0, sizeof(si) );
memset( &pi, 0, sizeof(pi) );
si.cb = sizeof(si);
CreateProcess(
NULL, “cmd.exe”, DEFAULT_SECURITY, DEFAULT_SECURITY,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi
);
CloseHandle( pi.hThread );
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
return 0;
}
При создании процесса ему можно передать описатели каналов
(CreatePipe), предназначенные для перенаправления stdin, stdout и stderr.
Описатели каналов должны быть наследуемыми.
Для завершения процесса рекомендуется применять функцию
ExitProcess, которая завершит процесс, сделавший этот вызов. В крайних
случаях можно использовать функцию TerminateProcess, которая может
завершить процесс, заданный его описателем. Этой функцией пользовать-
ся не рекомендуется, так как при таком завершении разделяемые библио-
теки будут удалены из адресного пространства уничтожаемого процесса
без предварительных уведомлений – это может привести в некоторых слу-
чаях к утечке ресурсов.
7.2.2.2. Адресное пространство процесса и проецирование файлов
В Windows потоки работают в одном адресном пространстве процес-
са, поэтому обмен данными между ними в большинстве случаев сводится
к доступу к общей разделяемой памяти. Иная ситуация в случае взаимо-
действия потоков, принадлежащим разным процессам: так как адресное
пространство процессов изолировано друг от друга, то приходится прини-
Разработка параллельных приложений для ОС Windows
245
• Использование объектов ядра для взаимной синхронизации. Рас-
смотрено при обсуждении взаимной синхронизации потоков.
При использовании именованных объектов или передаче описа-
телей объектов ядра другим процессам рассмотренные средства
могут использоваться для межпроцессной синхронизации.
• Проецирование файлов в адресное пространство процесса (File
Mapping). Один из базовых механизмов, рассматривается ниже.
• Использование файловых объектов. Каналы (Pipes), почтовые
ящики (Mailslots) и сокеты (Sockets). Еще один базовый меха-
низм; чаще применяется для организации межузлового взаимо-
действия, за исключением анонимных каналов (unnamed pipes,
anonymous pipes), которые используются для межпроцессного
взаимодействия в рамках одного узла. В данном курсе эти меха-
низмы не затрагиваются.
• Механизмы, ориентированные на обмен оконными сообщени-
ями (буфер обмена, DDE, сообщение WM_COPYDATA и др.). В сво-
ей основе используют механизм проецирования файлов для пе-
редачи данных между адресными пространствами процессов.
В данном курсе эти механизмы не затрагиваются.
• Вызов удаленных процедур (Remote Procedure Call, RPC). Являет-
ся надстройкой, использующей проецирование для реальной
передачи данных. Позволяет описать процедуры, реализован-
ные в других процессах, и обращаться к ним как к обычным
процедурам, локальным для данного процесса. RPC инкапсули-
рует вопросы нахождения реальной процедуры, выполняющей
необходимую работу, передачу данных в эту процедуру и получе-
ние от нее ответа. RPC позволяет организовать не только меж-
процессное взаимодействие, но также межузловое с передачей
данных по сети. В данном курсе не рассматривается.
• COM. Является еще более высокоуровневой абстракцией, в дан-
ном курсе также не рассматривается.
7.2.2.1. Создание процессов
Для создания процессов используются функции CreateProcess,
CreateProcessAsUser, CreateProcessWithLogonW и CreateProcessWithTokenW.
Функция CreateProcess создает новый процесс, который будет исполнять-
ся от имени текущего пользователя потока, вызвавшего эту функцию.
Функция CreateProcessAsUser позволяет запустить процесс от имени дру-
гого пользователя, который идентифицируется его маркером безопасно-
сти (security token); однако вызвавший эту функцию поток должен принять
меры к правильному использованию реестра, так как профиль нового
пользователя не будет загружен. Функции CreateProcessWithTokenW и
244
CIL и системное программирование в Microsoft .NET
244 CIL и системное программирование в Microsoft .NET Разработка параллельных приложений для ОС Windows 245 • Использование объектов ядра для взаимной синхронизации. Рас- CreateProcessWithLogonW позволяют при необходимости загрузить про- смотрено при обсуждении взаимной синхронизации потоков. филь пользователя и, кроме того, функция CreateProcessWithLogonW сама При использовании именованных объектов или передаче описа- получает маркер пользователя по известному учетному имени, домену и телей объектов ядра другим процессам рассмотренные средства паролю: могут использоваться для межпроцессной синхронизации. • Проецирование файлов в адресное пространство процесса (File #includeMapping). Один из базовых механизмов, рассматривается ниже. #define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL • Использование файловых объектов. Каналы (Pipes), почтовые ящики (Mailslots) и сокеты (Sockets). Еще один базовый меха- int main( void ) низм; чаще применяется для организации межузлового взаимо- { действия, за исключением анонимных каналов (unnamed pipes, STARTUPINFO si; anonymous pipes), которые используются для межпроцессного PROCESS_INFORMATION pi; взаимодействия в рамках одного узла. В данном курсе эти меха- memset( &si, 0, sizeof(si) ); низмы не затрагиваются. memset( &pi, 0, sizeof(pi) ); • Механизмы, ориентированные на обмен оконными сообщени- si.cb = sizeof(si); ями (буфер обмена, DDE, сообщение WM_COPYDATA и др.). В сво- CreateProcess( ей основе используют механизм проецирования файлов для пе- NULL, “cmd.exe”, DEFAULT_SECURITY, DEFAULT_SECURITY, редачи данных между адресными пространствами процессов. FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi В данном курсе эти механизмы не затрагиваются. ); • Вызов удаленных процедур (Remote Procedure Call, RPC). Являет- CloseHandle( pi.hThread ); ся надстройкой, использующей проецирование для реальной WaitForSingleObject( pi.hProcess, INFINITE ); передачи данных. Позволяет описать процедуры, реализован- CloseHandle( pi.hProcess ); ные в других процессах, и обращаться к ним как к обычным return 0; процедурам, локальным для данного процесса. RPC инкапсули- } рует вопросы нахождения реальной процедуры, выполняющей При создании процесса ему можно передать описатели каналов необходимую работу, передачу данных в эту процедуру и получе- (CreatePipe), предназначенные для перенаправления stdin, stdout и stderr. ние от нее ответа. RPC позволяет организовать не только меж- Описатели каналов должны быть наследуемыми. процессное взаимодействие, но также межузловое с передачей Для завершения процесса рекомендуется применять функцию данных по сети. В данном курсе не рассматривается. ExitProcess, которая завершит процесс, сделавший этот вызов. В крайних • COM. Является еще более высокоуровневой абстракцией, в дан- случаях можно использовать функцию TerminateProcess, которая может ном курсе также не рассматривается. завершить процесс, заданный его описателем. Этой функцией пользовать- ся не рекомендуется, так как при таком завершении разделяемые библио- 7.2.2.1. Создание процессов теки будут удалены из адресного пространства уничтожаемого процесса Для создания процессов используются функции CreateProcess, без предварительных уведомлений – это может привести в некоторых слу- CreateProcessAsUser, CreateProcessWithLogonW и CreateProcessWithTokenW. чаях к утечке ресурсов. Функция CreateProcess создает новый процесс, который будет исполнять- ся от имени текущего пользователя потока, вызвавшего эту функцию. 7.2.2.2. Адресное пространство процесса и проецирование файлов Функция CreateProcessAsUser позволяет запустить процесс от имени дру- В Windows потоки работают в одном адресном пространстве процес- гого пользователя, который идентифицируется его маркером безопасно- са, поэтому обмен данными между ними в большинстве случаев сводится сти (security token); однако вызвавший эту функцию поток должен принять к доступу к общей разделяемой памяти. Иная ситуация в случае взаимо- меры к правильному использованию реестра, так как профиль нового действия потоков, принадлежащим разным процессам: так как адресное пользователя не будет загружен. Функции CreateProcessWithTokenW и пространство процессов изолировано друг от друга, то приходится прини-
Страницы
- « первая
- ‹ предыдущая
- …
- 127
- 128
- 129
- 130
- 131
- …
- следующая ›
- последняя »