Win32::Semaphore->new
вызывает функцию Windows API CreateSemaphore
и получает дескриптор безопасности процесса по умолчанию , что обычно означает, что процессы, работающие от имени того же пользователя, что и ваш скрипт, могут иметь полный доступ, тогда как процессы, запущенные как другие учетные записи, не получают доступа Итак, для начала, ваше предположение неверно.
Имя, которое вы выбираете в своем коде Perl, передается непосредственно в функцию API, поэтому оно подчиняется тем же правилам пространства имен , что и все другие объекты ядра Win32.
Win32 :: Semaphore не предоставляет интерфейса для указания ограничений доступа. Даже если это так, Windows не предоставляет разрешения для каждого процесса. Разрешения привязаны к пользователю , а не к процессу .
Если вы получаете «отказано в доступе» из new
, то это говорит о том, что запущена другая программа, которая решила использовать то же имя для чего-то другого - может быть, другой семафор или, возможно, что-то еще, например событие или мьютекс - и этот процесс выполняется от имени другого пользователя.
Если вы получаете «отказано в доступе» из open
, то, в дополнение к возможностям для new
, может быть, что другой процесс уже открыл семафор с тем же именем, но не предоставил полные разрешения другим пользователям. Win32::Semaphore->open
запросы SEMAPHORE_ALL_ACCESS
разрешение .
Если семафор уже открыт процессом, выполняющимся от имени того же пользователя, вы не должны получать «доступ запрещен». В этом случае ни new
, ни open
не должны завершиться ошибкой, хотя $^E
может в любом случае содержать 183 (ERROR_ALREADY_EXISTS
).