Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


«ащита процесса




ќбычно функци€ CreateProcess предоставл€ет права доступа к процессу на уровне PROCESS_ALL_ACCESS. ќднако имеетс€ возможность определени€ детализированных прав доступа, из которых в качестве примера можно назвать права доступа PROCESS_QUERY_INFORMATION, CREATE_PROCESS, PROCESS_TERMINATE, PROCESS_SET_INFORMATION, DUPLICATE_HANDLE и CREATETHREAD. ¬ частности, с учетом возможных рисков, которые могут подстерегать вас в случае принудительного завершени€ выполн€ющихс€ процессов, на что мы уже неоднократно обращали ваше внимание, может оказатьс€ полезным ограничить предоставление прав доступа к процессам на уровне PROCESS_TERMINATE дл€ родительского процесса. ѕодробнее об атрибутах защиты процессов и других объектов говоритс€ в главе 15.

¬ UNIX дл€ ожидани€ завершени€ процессов используютс€ функции wait и waitpid, однако отсутствует пон€тие интервала ожидани€, хот€ функци€ waitpid может опрашивать процессы (существует возможность ее вызова без блокировки). Ёти функции способны ожидать лишь завершени€ дочерних процессов, и эквивалентных им функций, применимых к р€ду процессов, не существует, хот€ и возможно ожидание завершени€ всех процессов, относ€щихс€ к одной группе.  роме того, имеетс€ одно незначительное отличие, заключающеес€ в том, что функции wait и waitpid возвращают код завершени€ сами, в результате чего отпадает необходимость в вызове отдельной функции, эквивалентной функции GetExitCodeProcess.

—троки окружени€, аналогичные строкам окружени€ Windows, поддерживаютс€ и в UNIX. ‘ункци€ getenv (вход€ща€ в библиотеку —) имеет те же самые функциональные возможности, что и функци€ GetEnvironmentVariable, но программист сам должен заботитьс€ о необходимом размере буфера. ‘ункции putenv, setenv и unsetenv обеспечивают различные способы добавлени€, изменени€ и удалени€ переменных окружени€ и их значений, предлага€ функциональность, аналогичную функциональности SetEnvironmentVariable.

ѕример: параллельный поиск указанного текстового шаблона

Ќастало врем€ посмотреть на процессы Windows в действии. ѕриведенна€ ниже в качестве примера программа grepMP создает процессы дл€ поиска указанного текстового шаблона в файлах, по одному процессу на каждый файл. Ёта программа моделирует UNIX-утилиту grep, хот€ используема€ нами методика применима к любой программе, котора€ полагаетс€ на стандартный вывод. –ассматривайте программу поиска как "черный €щик" и считайте, что она €вл€етс€ просто исполн€емой программой, выполнение которой должно контролироватьс€ родительским процессом.

 омандна€ строка программы имеет следующий вид:

grepMP шаблон F1 F2 Е FN

ѕрограмма 6.1 выполн€ет следующие виды обработки:

Х ƒл€ поиска указанного шаблона в каждом из входных файлов, от F1 до FN, используетс€ отдельный процесс, запускающий один и тот же исполн€е мый модуль. ƒл€ каждого процесса программа создает командную строку такого вида: grep шаблон FK.

Х ѕолю hStdOut структуры STARTUPINFO нового процесса присваиваетс€ значение дескриптора временного файла, который определ€етс€ как наследуемый.

Х ѕрограмма организует ожидание завершени€ всех процессов поиска, использу€ дл€ этого функцию WaitForMultipleObjects.

Х ѕо завершении всех процессов поиска осуществл€етс€ поочередный вывод результатов (временных файлов). ¬ывод временного файла осуществл€ет процесс, выполн€ющий утилиту cat (программа 2.3).

Х ¬озможности функции WaitForMultipleObjects ограничиваютс€ лишь максимально допустимым количеством дескрипторов, которое устанавливаетс€ значением MAXIMUM_WAIT_OBJECTS (64), поэтому она вызываетс€ многократно.

Х ƒл€ определени€ успешности попытки нахождени€ данным процессом заданного шаблона программа использует код завершени€ процесса grep.

ѕор€док обработки файлов программой 6.1 иллюстрируетс€ на рис. 6.3.

–ис. 6.«. ѕоиск текстового шаблона в файлах с использованием нескольких процессов

 

ѕрограмма 6.1. grepMP: выполнение параллельного поиска текстового шаблона

/* √лава 6. grepMP. */

/* ¬ерси€ команды grep, использующа€ несколько процессов. */

#include "EvryThng.h"

 

int _tmain(DWORD argc, LPTSTR argv[])

/* ƒл€ выполнени€ поиска в каждом из файлов, указанных в командной строке, создаетс€ отдельный процесс.  аждому процессу предоставл€етс€ временный файл в текущем каталоге, в котором сохран€ютс€ результаты. */

{

HANDLE hTempFile;

SECURITY_ATTRIBUTES StdOutSA = /* јтрибуты защиты дл€ наследуемого дескриптора. */

{sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};

TCHAR CommandLine[MAX_PATH + 100];

STARTUPINFO StartUpSearch, Startup;

PROCESS_INFORMATION ProcessInfo;

DWORD iProc, ExCode;

HANDLE *hProc; /* ”казатель на массив дескрипторов процессов. */

typedef struct {TCHAR TempFile[MAX_PATH];} PROCFILE;

PROCFILE *ProcFile; /* ”казатель на массив имен временных файлов. */

GetStartupInfo(&StartUpSearch);

GetStartupInfo(&StartUp);

ProcFile = malloc((argc Ц 2) * sizeof(PROCFILE));

hProc = malloc((argc Ц 2) * sizeof(HANDLE));

/* —оздать дл€ каждого файла отдельный процесс "grep". */

for (iProc = 0; iProc < argc Ц 2; iProc++) {

_stprintf(CommandLine, _T("%s%s %s"), _T("grep "), argv[1], argv[iProc + 2]);

GetTempFileName(_T("."), _T("gtm"), 0, ProcFile[iProc].TempFile); /* ƒл€ хранени€ результатов поиска.*/

hTempFile = /* Ётот дескриптор €вл€етс€ наследуемым */

CreateFile(ProcFile[iProc].TempFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &StdOutSA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

StartUpSearch.dwFlags = STARTF_USESTDHANDLES;

StartUpSearch.hStdOutput = hTempFile;

StartUpSearch.hStdError = hTempFile;

StartUpSearch.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

/* —оздать процесс дл€ выполнени€ командной строки. */

CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartUpSearch, &ProcessInfo);

/* «акрыть ненужные дескрипторы. */

CloseHandle(hTempFile);

CloseHandle(ProcessInfo.hThread);

hProc[iProc] = ProcessInfo.hProcess;

}

/* ¬ыполнить все процессы и дождатьс€ завершени€ каждого из них. */

for (iProc = 0; iProc < argc Ц 2; iProc += MAXIMUM_WAIT_OBJECTS) WaitForMultipleObjects(/* –азрешить использование достаточно большого количества процессов */

min(MAXIMUM_WAIT_OBJECTS, argc Ц 2 Ц iProc), &hProc [iProc], TRUE, INFINITE);

/* ѕереслать результирующие файлы на стандартный вывод с использованием утилиты cat */

for (iProc = 0; iProc < argc Ц 2; iProc++) {

if (GetExitCodeProcess(hProc[iProc], &ExCode) && ExCode==0) {

/* ќбнаружен шаблон Ч ¬ывести результаты. */

if (argc > 3) _tprintf(_T("%s:\n"), argv [iProc + 2]);

fflush(stdout); /* »спользование стандартного вывода несколькими процессами. */

_stprintf(CommandLine, _T("%s%s"), _“("cat "), ProcFile[iProc].TempFile);

CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartUp, &ProcessInfo);

WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

CloseHandle(ProcessInfo.hProcess);

CloseHandle(ProcessInfo.hThread);

}

CloseHandle(hProc [iProc]);

DeleteFile(ProcFile[iProc].TempFile);

}

free(ProcFile);

free(hProc);

return 0;

}





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-09-20; ћы поможем в написании ваших работ!; просмотров: 531 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

Ќеосмысленна€ жизнь не стоит того, чтобы жить. © —ократ
==> читать все изречени€...

1302 - | 1130 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.013 с.