Программирование для Windows NT

Открывание семафора


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

Существующий семафор можно открыть функцией OpenSemaphore, прототип которой приведен ниже:

HANDLE OpenSemaphore(

  DWORD   fdwAccess,           // требуемый доступ

  BOOL    fInherit,            // флаг наследования

  LPCTSTR lpszSemaphoreName ); // адрес имени семафора

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

Значение

Описание



SEMAPHORE_ALL_ACCESS

Указаны все возможные флаги доступа

SEMAPHORE_MODIFY_STATE

Возможно изменение значение счетчика семафора функцией ReleaseSemaphore

SYNCHRONIZE

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

Параметр fInherit определяет возможность наследования полученного идентфикатора. Если этот параметр равен TRUE, идентфикатор может наследоваться дочерними процессами. Если же он равен FALSE, наследование не допускается.

Через параметр lpszSemaphoreName вы должны передать функции адрес символьной строки, содержащей имя семафора.

Если семафор открыт успешно, функция OpenSemaphore возвращает его идентификатор. При ошибке возвращается значение NULL. Код ошибки вы можете определить при помощи фукнции GetLastError.



Содержание раздела