2016-07-21 2 views
1

'세마포어에 열린 참조가없는'경우 세마포어 이름 제거 (*)는 sem_unlink는() 세마포어

  • 1) 어떤이 '참조'이다의 이름을 제거합니다 ?
  • 2) 관련된 프로세스를 식별하기 위해 이러한 참조를 쿼리 할 수 ​​있습니까?

동일한 문단은 '세마포어에 대한 열린 참조가없는 경우 계속 파괴됩니다. 그렇지 않으면 마지막 열린 참조가 닫힐 때까지 파기가 연기됩니다. ' 이것은 OS가 세마포어를 파괴 할 수있을 때까지이 참조를 계속 쿼리한다는 것을 의미합니다. 세마포어 값보다 더 많은 '참조'가 있습니까?

(*) W.R. Stevens, S.A. Rago 'UNIX 환경에서의 고급 프로그래밍', 제 3 판, 페이지. 581.

답변

0

"이러한 참조는 무엇입니까?"

명명 된 세마포어는 /somename 형식의 이름으로 식별됩니다. 그 문자가 인 경우, 최대 종료 문자가 인 NAME_MAX -4 (즉, 251) 문자는 슬래시가 아닌 문자가 뒤에 오는 슬래시로 구성됩니다. sem_open(3)에 동일한 이름을 전달하여 동일한 이름의 세마포어 인 에서 두 프로세스가 작동 할 수 있습니다.

티는 기본적으로 기반 (충분한 권한이있는 경우 (sem_open(3)에 전달 O_CREAT 플래그) (/somename의 형태로) 명명 된 세마포어를 생성하는 프로세스가 다른 프로세스가 세마포어라는 이름의 그에서 작동 할 수있게된다는 것을 의미합니다 해당 uid/gid은 해당 세마포를 생성하고 modesem_open(3)에게 전달됨).

이것은 동일한 파일을 여는 두 프로세스와 유사한 간단한 방법입니다. 은 두 개 이상의 서로 다른 프로세스에서 동일한 세마포어을 식별하고 작동합니다.

"관련 참조 프로세스를 식별하기 위해 이러한 참조를 쿼리 할 수 ​​있습니까?"

아니요 (적어도, POSIX 방식으로).

"이것은 OS가 세마포어를 파괴 할 수있을 때까지 계속이 쿼리를 쿼리한다는 것을 의미합니다."

이것은 구현에 특화되어 있지만 OS가 세마포어를 쿼리하여 계속 연결 해제 할 수 있는지 여부를 결정할 필요가 없습니다. 간단한 참조 카운터로 보자. Process#3sem_unlink()을 호출했지만 여전히 Process#2Process#1이 여전히 해당 세마포어를 사용하고 있다면,이 시점에서 참조 카운터는 2가된다. sem_close() 또는 sem_unlink() 호출마다 참조 카운터 값을 평가하여 0에 도달했는지 확인한 다음 명명 된 세마포어를 효과적으로 연결 해제하면됩니다.

+0

답장을 보내 주셔서 감사합니다. 프로세스가 순서가 잘못된 sem_post()를 실행하여 보류중인 프로세스가 잘못 실행될 수 있습니까? – ovi

+0

@ovi 아키텍처 수준 구현에 대해 걱정할 필요가 없습니다. POSIX [정의 된 동작] 사양을 따르면 모든 것이 예상대로 작동해야합니다. – pah

+0

내 질문은 내 응용 프로그램이 직면 한 실제 상황의 결과입니다. 사용자 유도 비동기 이벤트로 인해 대기 게시가 중단 될 수 있습니다. 이것을 정리하려고 할 때 외부 프로세스는 무조건적으로 세마포어의 링크를 해제하고 제거하는 방법이 필요합니다. 나는 (임의의) 10 개의 호출을 '게시'에 연결 한 다음 연결을 해제하는 정리 프로세스를 구현하려고 시도했으며 제대로 작동하는 것처럼 보입니다. 난 단지 내 솔루션이 무차별 적이며 유효한/합법적인지 확인하고 싶다. – ovi