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


ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 22. 1. Ожидание завершения процесса




1. Ожидание завершения процесса.

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

• Функции ожидания могут работать с самыми различными типами объектов; дескрипторы процессов являются лишь самым первым из рассматриваемых нами примеров применения этих функций.

• Эти функции могут ожидать завершения одного процесса, первого из нескольких указанных процессов или всех процессов, образующих группу.

• Существует возможность устанавливать конечный интервал ожидания (time-out).

Обе рассмотренных ниже функции ожидают перехода объекта синхронизации в сигнальноесостояние. Например, система переводит процесс в сигнальное состояние, когда он завершается или его выполнение прекращается извне. Функциями ожидания, которые мы будем впоследствии неоднократно использовать, являются следующие функции:

DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds)

DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles, BOOL fWaitAll, DWORD dwMilliseconds)

Возвращаемое значение: указывает причину завершения ожидания или, в случае ошибки, равно 0xFFFFFFFF (для получения более подробной информации используйте функцию GetLastError).

В аргументах этих функций указывается либо дескриптор одиночного процесса (hObject), либо дескрипторы ряда отдельных объектов, хранящиеся в массиве, на который указывает указатель lpHandles. Значение параметра nCount, определяющего размер массива, не должно превышать значение MAXIMUM_WAIT_OBJECTS (определено равным 64 в файле WINNT.Н).

dwMilliseconds — число миллисекунд интервала ожидания. Если значение этого параметра равно 0, то возврат из функции осуществляется сразу же после проверки состояния указанного объекта, что позволяет программе опрашивать процессы для определения их состояния завершения. Если же значение этого параметра равно INFINITE, то ожидание длится до тех пор, пока ожидаемый процесс не завершится.

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

Возможными возвращаемыми значениями этой функции в случае ее успешного завершения являются следующие:

• WAIT_OBJECT_0 — означает, что указанный объект перешел в сигнальное состояние (в случае функции WaitForSingleObject) или что одновременно все nCount объектов перешли в сигнальное состояние (в специальном случае функции WaitForMultipleObject, когда значение параметра fWaitAll равно TRUE).

• WAIT_OBJECT_0+n, где 0 ≤ n < nCount — вычтите значение WAIT_OBJECT_0 из возвращенного значения, чтобы определить, выполнение какого именно процесса завершилось, когда ожидается завершение выполнения любого из группы процессов. Если в сигнальное состояние перешли несколько объектов, то возвращается наименьшее из возможных значений. WAIT_ABANDONED является возможным базовым значением в случае использования дескрипторов мьютексов; см. главу 8.

• WAIT_TIMEOUT — указывает на то, что в течение отведенного периода ожидания сигнализируемый объект (объекты) не смогли удовлетворить условию ожидания.

• WAIT_FAILED — означает неудачное завершение функции, вызванное, например, тем, что у дескриптора отсутствовали права доступа SYNCHRONIZE.

• WAIT_ABANDONED_0 — это значение невозможно в случае процессов и рассматривается в главе 8 при рассмотрении мьютексов.

Для определения кода завершения процесса используется функция GetExitCodeProcess, описанная в предыдущем разделе.

 

2. Приостановка и продолжение выполнения потоков.

Для каждого потока поддерживается счетчик приостановок (suspend count), и выполнение потока может быть продолжено лишь в том случае, если значение этого счетчика равно 0. Поток может увеличивать или уменьшать значение счетчика приостановок другого потока с помощью функций SuspendThread и Resume-Thread. Вспомните, что поток можно создать в приостановленном состоянии со счетчиком приостановок равным 1.

DWORD ResumeThread(HANDLE hThread)

DWORD SuspendThread(HANDLE hThread)

В случае успешного выполнения обе функции возвращают предыдущее значение счетчика приостановок, иначе — 0xFFFFFFFF.

 

 

3. Атрибуты безопасности.

Почти любой объект, созданный с помощью системного вызова Create, в

первую очередь имеет параметр атрибутов безопасности. Поэтому программы

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

каналы и т.д.

Создание безопасности начинается с включения в вызов Create структуры

SECURITY_ATTRIBUTES.

Важный элемент структуры SECURITY_ATTRIBUTES – указатель на

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

объекта и пользователях, которым предоставлены или запрещены различныеправа.

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

определяет пользователя-владельца и принадлежность к группе. Когда процесс

пытается обратиться к объекту, ядро Windows NT может опознать процесс поэтому маркеру и на основании информации в дескрипторе безопасности

решить, имеет ли процесс требуемые права на обращение к объекту.

Атрибуты безопасности имеют следующее определение:

Typedef struct _ SECURITY_ATTRIBUTES {

DWORD nLength; // Размер структуры

LPVOID lpSecurityDescriptor; // Дескриптор безопасности,

// контролирующий доступ к объекту

BOOL bInheritHandle; // Разрешает наследование

//дескриптора (handle) дочерним процессом

} SECURITY_ATTRIBUTES;

Элемент nLength должен иметь значение

sizeof (SECURITY_ATTRIBUTES).

Обзор элементов безопасности: дескриптор безопасности.

Дескриптор безопасности инициализируется функцией

InitializeSecurityDescriptor.

Структура SECURITY_DESCRIPTOR хранит в себе информацию, связанную

с защитой некоторого объекта от несанкционированного доступа. В этой

структуре, которую называют дескриптором безопасности, содержится

информация о том, какие пользователи обладают правом доступа к объекту и какие действия эти пользователи могут выполнить в отношении этого объекта.

Дескриптор безопасности объекта хранит в себе следующую информацию;

- SID (security identifier) владельца объекта;

- SID основной группы владельца объекта;

- список разграничительного контроля доступа (Discretionary Access

Control List, DACL-дискреционный список управления доступом);

- системный список управления доступом (System Access Control List,

SACL);

- управляющая информация (например, сведения о том, как списки ACL

передают информацию дочерним дескрипторам безопасности);

Список DACL определяет, кто обладает (и кто не обладает) правом доступах

объекту. Список SACL определяет, информация о каких действиях вносится в файл журнала.

Функция InitializeSecurityDescriptor инициализирует указанный вами

дескриптор таким образом, что в нем отсутствует DASL, SACL, владелец и

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

Дескриптор в абсолютном (absolute) формате содержит лишь указатели на

информацию, связанную с защитой объекта. В отличие от этого дескриптор в относительном (self-relative) формате включает в себя всю необходимую

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

Таким образом, абсолютный дескриптор нельзя записать на диск (так как при последующем чтении его с диска все указатели потеряют смысл), а

относительный дескриптор — можно.

Windows позволяет преобразовывать абсолютный дескриптор в

относительную форму и обратно. Обычно это требуется лишь в случае, если вы записываете дескриптор на диск и считываете дескриптор с диска. Системные вызовы, требующие передачи указателя на дескриптор безопасности, работают только с дескрипторами в абсолютном формате.

Преобразование осуществляется при помощи вызовов

MakeSelfRelativeSD и MakeAbsoluteSD. Преобразовать абсолютную

форму в относительную несложно. Однако обратное преобразование (из

относительной в абсолютную) обычно выполняется в несколько этапов.

Функции SetSecurityDescriptorOwner и SetSecurityDescriptorGroup

связывают SID с дескрипторами безопасности. Списки ACL инициализируются с помощью функции InitializeAcl и затем связываются с дескриптором безопасности функциями SetSecurityDescriptorDacl или

SetSecurityDescriptorSacl.

Списки контроля доступа

Каждый ACL представляет собой набор (список) элементов управления

доступом (access control entry — ACE). Существует два типа элементов

управления доступом: для разрешения и для запрещения доступа.

Сначала ACL инициализируется функцией InitializeAcl, а затем в него

добавляются элементы управления доступом. Каждый АСЕ содержит

идентификатор SID и маску доступа, которая определяет предоставляемые или запрещаемые права. Типичные права доступа — GENERIC_READ и DELETE.

Для добавления элементов управления доступом в разграничительные ACL

служат две функции: AddAccessAllowedAce и AddAccessDeniedAce.

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

И наконец, для удаления элементов управления доступом служит функция

DeleteAce, а для обращения к ним — GetAce.

Использование безопасности объектов Win32

Каждый процесс также имеет идентификаторы SID (в маркере доступа), на

основании которых ядро системы определяет, разрешен ли доступ и надо ли

вести аудит. Маркер доступа также может давать владельцу некоторые

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

Легко увидеть, что происходит, когда процесс выдает запрос на обращение к объекту. Во-первых, процесс имеет некоторые привилегии на основании своего удостоверения пользователя и его принадлежности к группе. Эти привилегии записаны в идентификаторах SID.

Если идентификаторы пользователя и группы не разрешают доступа, ядро

системы ищет права доступа в ACL. Первый элемент, который определенно

предоставляет или запрещает требуемую службу, имеет решающее значение.

Поэтому важен порядок, в котором элементы управления доступом вводятся в ACL. Часто АСЕ, запрещающие доступ, помещаются в начало списка, чтобы пользователь, определенно лишенный доступа, не получил его на основании членства в группе, имеющей такой доступ. Но можно смешивать элементы разрешения и запрещения, чтобы получить желательную семантику. АСЕ, запрещающий все права, может быть последним в списке; это гарантирует, что всем пользователям, явно не упомянутым в АСЕ, доступ будет запрещен.




Читайте также:
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



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

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

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

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

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

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



(0.005 сек.)