SYS V 세마포어를 사용해야하는 프로젝트가 있습니다.여러 프로세스에서 사용하는 SYS V 세마포를 올바르게 제거합니다.
bool semaphore_init(semaphore_id_t* sem, int sem_value, key_t key)
{
/* Try to get a semaphore, to check if you will be an owner */
*sem = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);
if (*sem == -1)
{
if (errno == EEXIST)
{
/* We are not owners, get semaphore without exclusive flag */
*sem = semget(key, 1, IPC_CREAT | 0666);
if (*sem == -1) return false;
}
else return false;
}
else
{
/* We are owners, initialize semaphore */
int return_value = semctl(*sem , 0, SETVAL, sem_value);
if (return_value == -1) return false;
}
return true;
}
내 문제는 다음과 같습니다 : 나는 세마포어 (동일한 키를 사용)를 공유하고이 코드로 초기화하는 여러 프로세스를 가지고 내가이 세마포어를 제거 할 때 종료됩니다 사용하는 모든 프로세스. 사용 :
semctl(*sem, 0, IPC_RMID)
은 선택할 수 없습니다. 즉시 세마포어를 삭제하고 다른 프로세스는 정의되지 않은 동작을 갖습니다. SYS V API로 올바른 방법을 찾을 수 없습니다.
문제는 라이브러리가 분산되어 있다는 것입니다. 당신이 말했듯이 참조 카운팅을 위해 다른 세마포어를 사용해야 할 것입니다. 그러나 누가 그것을 풀 것인가? –