Открывание семафора
Если семафор используется только для синхронизации задач, созданных в рамках одного приложения, вы можете создать безымянный семафор, указав в качестве параметра 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.