2009-09-21 2 views
2

일단 프로세스에 의해 세마포어가 생성되면 모든 프로세스/사용자가 세마포어에 액세스 할 수 있다고 가정합니다.세마포어에 대한 액세스 권한을 설정 하시겠습니까?

특정 프로세스/사용자 만 액세스 할 수 있거나 특정 프로세스 만이 해당 세마포를 릴리스 할 수 있도록 특정 세마포어에 액세스 제한을 설정할 수 있습니까?
모든 프로세스에서 세마포어를 액세스 할 수있게 만들면 몇 가지 문제가 발생합니다. 예 : 더미 프로세스는 세마포어를 읽고 세마포어 잠금을 실제로 기다리고있는 실제 프로세스에 거짓 신호를 보내려는 잠금을 해제 할 수 있습니다. 나는 다음과 같은 코드로 매우 이상한 결과를 얻고로

이러한 모든 문제가 발생됩니다 위의 프로그램을 실행하여

use Win32::Semaphore; 

$sem = Win32::Semaphore->new(0, 1,"reliance2692") 
    or print "Can't create semaphore\n"; 

$sem = Win32::Semaphore->open("reliance2692") 
    or print "Can't open semaphore\n"; 

print "Semaphore:" . $sem . "\n"; 

, 나는

 
Can't create semaphore 
Can't open semaphore 

출력은 다음과 같은 출력을 얻고있다 세마포어를 만들지 못했고 심지어 세마포어를 열지 못했습니다. 지정된 이름으로 세마포어가 이미 존재하면 세마포를 만드는 데 실패 할 수 있습니다. 세마포어를 여는 데 실패한 이유를 모르겠습니다.

세마포어를 생성하는 두 가지 모두가 세마포어를 열지 못하는 시나리오를 명확히 할 수 있습니까?

+0

설정 하시겠습니까? 액세스 제한, 또는 액세스 제한이 문제라고 생각하십니까? –

+0

여기서 액세스 제한이 문제입니다. 세마포어가 다른 프로세스에 의해 먼저 생성되었고 Win32를 사용하여 세마포어를 해제하려고합니다 :: Semaphore –

답변

1

새로운 세마포어 객체 포드

$semaphore = Win32::Semaphore->new($initial, $maximum, [$name])

생성자 Win32::Semaphore에서. $ initial은 초기 카운트이며, $ maximum은 세마포어의 최대 카운트 인 입니다. $ name이 생략되거나 undef 인 경우 이름이 지정되지 않은 세마포어 객체가 생성됩니다.

$ name이 기존의 세마포어 개체를 나타내면 $ initial 및 $ maximum이 무시되고 개체가 열립니다.이 경우 $^E은 183 (ERROR_ALREADY_EXISTS)으로 설정됩니다. 내가 올바르게 읽고 있어요 경우

Win32::Semaphore->new에 전화가 기존의 세마포어를 참조하는 경우, 다음 나에게 분명하지 않다합니다 (new 전화뿐만 아니라 세마포어를 열 것이며, 이후 open 호출은 중복됩니다 너가 이미 열리는 sempahore을 열면 일어날 것입니다 꼬투리에서).

각 단계에서 $sem의 값과 $!$^E의 값을 확인할 수 있습니다.

추가 답변 :Windows API는 세마포어의 액세스 제어를 설정하는 방법을 가지고 있지만,

  1. 그들은
  2. 액세스 제어 될 펄 Win32::Semaphore 모듈에서 할 수없는 노출되지 않는 것 같습니다 세마포를 만든 다른 프로세스에서 이미 허용하지 않은 경우 설정하십시오.

이 문제에 대한 좋은 옵션이 있는지 궁금합니다. 액세스 제한을 완화하기 위해 세마포를 만드는 프로세스를 수정할 수 있습니까? Win32::Semaphore 작성자에게 모듈을 업데이트하도록 요청 하시겠습니까? Win32::Semaphore을 직접 고치십시오.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. $^E는 두 경우 모두 "액세스가 거부되었습니다"로 설정되어 있습니다. 이는 세마포를 만들고 세마포어를 여는 것을 의미합니다. 이 스 니펫을 실행하기 전에 다른 프로세스에서 만든대로 세마포가 이미 있습니다. 모든 프로세스가 액세스 할 수 있도록 Win32 :: Semaphore를 사용하여 생성하는 동안 세마포어 권한을 설정할 수있는 방법이 있습니까? –

3

Win32::Semaphore->new는 Windows API 함수 CreateSemaphore를 호출하고 보통 다른 계정으로 실행중인 프로세스가 액세스 할 수없는 반면, 스크립트와 같은 사용자로 실행중인 프로세스가 모든 권한을 가질 수 있다는 것을 의미 프로세스의 기본 보안 설명를 가져옵니다. 그래서 우선, 당신의 가정은 거짓입니다.

Perl 코드에서 선택한 이름이 API 함수에 직접 전달되므로 다른 Win32 커널 개체와 마찬가지로 namespace rules이 적용됩니다.

Win32 :: Semaphore는 액세스 제한을 지정하기위한 인터페이스를 제공하지 않습니다. 그랬더라도 Windows는 프로세스 별 권한을 제공하지 않습니다. 사용 권한은 사용자에만 적용되며 과정에는 적용되지 않습니다.

new에서 "액세스가 거부되었습니다"라는 메시지가 표시되면 다른 이름의 프로그램을 사용하고있는 다른 프로그램이 있음을 알 수 있습니다. 예를 들어 다른 세마포어 또는 이벤트 나 뮤텍스와 같은 다른 프로그램이있을 수 있습니다. 해당 프로세스가 다른 사용자로 실행 중입니다.

open에서 "액세스가 거부되었습니다"라는 메시지가 표시되는 경우 new의 가능성 외에도 다른 프로세스가 이미 같은 이름의 세마포를 열었지만 다른 사용자에게 전체 권한을 부여하지 않았을 수 있습니다 . Win32::Semaphore->open 요청 SEMAPHORE_ALL_ACCESS permission.

동일한 사용자로 실행중인 프로세스에서 이미 세마포어를 연 경우 "액세스 거부"가 발생하지 않아야합니다. 어쨌든 $^E이 183 (ERROR_ALREADY_EXISTS)을 보유 할 수 있지만 new이나 open도 실패하지 않아야합니다.

2

레코드의 경우 저자는 Win32::Semaphore입니다. mobrule과 Rob이 설명했듯이 Windows 보안은 사용자/그룹 기반입니다. 특정 프로세스 만 액세스 할 수있는 세마포를 가질 수 없습니다. 사용자가 속한 프로세스가 세마포어에 액세스 할 수있는 경우 해당 사용자의 프로세스가 해당 세마포어에 액세스 할 수 있습니다.

일반적으로 기본 액세스는 현재 사용자 만이 세마포를 액세스하도록 허용합니다. 아무도 Win32 :: Semaphore에 기본이 아닌 보안 설명자를 지정하는 기능을 요청한 적이 없으며 관련 API는 중요하지 않습니다. 누군가 SECURITY_ATTRIBUTES 구조체를 관리하기위한 모듈을 만든다면 Win32 :: Semaphore 및 관련 IPC 모듈에 대한 지원을 추가하게되어 기쁩니다. Win32-Security은 시작 일지 모르지만 해당 모듈로 보이지 않습니다.

여러 사용자간에 작업하기 위해 세마포가 필요한 경우 현재 유일한 해결책은 적절한 SECURITY_ATTRIBUTES 포인터를 전달하여 Win32 :: Semaphore 외부에서 세마포를 만드는 것입니다. C로 작성된 작은 도우미 프로그램을 사용하거나 Inline::C을 사용하여이를 수행 할 수 있습니다. 한 번 생성 된 세마포는 프로세스에 열려있는 핸들이있는 한 존재한다는 것을 기억하십시오. 보조자 프로그램은 Win32::Semaphore->open을 호출 할 때까지 도우미 프로그램이 세마포어 핸들을 열린 상태로 유지해야합니다.

+0

6 년 후 .. 나는 "Everyone"이 "Global \"로 시작하는 세마포어 (읽기/쓰기)를 사용할 수있는 능력을 필요로하지 않습니다. 이 곳을 요청하는 가장 좋은 곳은 어디입니까? – Terris

관련 문제