2016-11-03 4 views
0

semget (IPC_CREAT | IPC_EXCL 플래그 전달)로 세마포어 그룹 id를 만들 때 - 일반적으로 그룹 내의 내 세마포어가 초기화되지 않고 "임의 값"을 포함 할 수 있습니다.semget : 생성/초기화시 세마포어 그룹에 대한 동시 액세스를 피하는 방법은 무엇입니까?

그래서 새로 만든 세마포 그룹의 ID를 얻은 직후 모든 세마포를 초기화해야합니다.

내 질문은 :

어떻게 semgrpID=semget(semgrpKey,nSemaphores,IPC_CREAT | IPC_EXCL);semctl(semgrpID,0,SETALL,...); 사이의 잠재적 인 경쟁 조건을 피하기 위해?

+0

세마포를 만드는 프로세스는 세마포를 사용하는 프로세스를 만들기 전에 초기화를 완료해야합니다. 이를 처리하는 일반적인 방법은 세마포어를 생성/초기화 한 다음 다른 프로세스를 fork/exec하는 것입니다. – user3386109

+0

이 세마포어 그룹에 액세스하는 프로세스는 CLI에서 crond로 시작할 수 있으며 웹 서버에서 초기화 할 수 있습니다. 단일 프로세스에서 분기되지 않습니다. 그래서 세마포 그룹 자체를 보호해야하지만, 이걸 위해서 ... 어딘가에 세마포가 필요합니까? – drvtiny

+0

그런 다음 시동 순서의 일부로 세마포어 그룹을 만들고 초기화하는 프로그램을 실행해야합니다. 세마포어를 사용하는 프로그램을 시작하기 전에 완료해야합니다. – user3386109

답변

2

SYSV 세마포어 대신 POSIX 세마포어를 사용하는 것을 고려하십시오. POSIX 디자인은 더 간단하고 깨끗합니다. 예를 들어, POSIX 세마포어는 지정된 초기 값으로 생성됩니다.

그러나 SYSV 세마포어에는 수행 할 수없는 작업 및 다중 요소 세마포어 집합 작업은과 같은 POSIX 세마포가 수행하지 못하는 기능이 있습니다. SYSV flavor를 사용해야한다면 ...

잘 알려진 키를 사용하여 세마포어 세트를 사용한다고 가정 해 보겠습니다. 그러면 생성 된 것과 다른 프로세스의 타이밍을 제어 할 수 없습니다 세마포어 세트는 세트에 액세스합니다. 최악의 경우, 동일한 키와 IPC_CREAT | IPC_EXCL을 사용하여 세마포어 집합을 얻으려는 여러 프로세스가있을 수 있으며 초기화에 성공한 프로세스와 해당 플래그없이 다시 시도하는 프로세스는 EEXIST입니다. 실제로, 그것은 엉망을 만듭니다.

관련없는 프로세스가 잘 알려진 세마포 집합 키를 사용하는 경우 관련된 세마포 집합은 시스템 리소스이며 프로세스에 개별적으로 속하지 않습니다. 이 경우 초기화 및 관리 전용 프로그램이 있어야합니다. 이들은 시스템 초기화 프레임 워크에 연결되어야합니다.

세마포 집합의 초기화를 보호하기 위해 다른 형태의 상호 배타를 사용할 수도 있습니다. 예를 들어 잠금 파일을 사용할 수 있습니다. 이 제한된 목적을 위해 POSIX 세마포어를 사용할 수도 있습니다.

+0

대단히 고마워,이 정확히 내가 알고 싶은 것입니다! – drvtiny