J'ai un projet dans lequel je dois utiliser des sémaphores SYS V. J'ai plusieurs processus qui partagent un sémaphores (en utilisant la même clé) et l'initialiser avec ce code:Suppression correcte du sémaphore SYS V utilisé par plusieurs processus
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;
}
Mon problème est: Je veux supprimer ce sémaphores lorsque tous les processus qui l'utilisent prendra fin. Utilisation:
semctl(*sem, 0, IPC_RMID)
n'est pas une option. Il supprime instantanément le sémaphore et les autres processus ont un comportement indéfini. Je ne peux pas trouver la bonne façon de le faire avec SYS V API.
Le problème est que la bibliothèque est décentralisée. Comme vous l'avez dit, je devrais utiliser un autre sémaphore pour le comptage des références. Mais qui le libérerait? –