J'ai plusieurs applications compilées avec g++, fonctionnant sous Ubuntu. J'utilise des sémaphores nommés pour coordonner les différents processus.
Tout fonctionne bien sauf dans la situation suivante : Si l'un des processus appelle sem_wait()
ou sem_timedwait()
pour décrémenter le sémaphore, puis se plante ou est tué -9 avant d'avoir eu la chance d'appeler sem_post()
alors, à partir de ce moment, le sémaphore en question est "inutilisable".
Par "inutilisable", je veux dire que le compte du sémaphore est maintenant à zéro, et que le processus qui aurait dû le remettre à 1 est mort ou a été tué.
Je ne peux pas trouver un sem_*()
API qui pourrait me dire que le processus qui l'a décrémenté en dernier s'est écrasé.
Est-ce qu'il me manque une API quelque part ?
Voici comment j'ouvre le sémaphore nommé :
sem_t *sem = sem_open( "/testing",
O_CREAT | // create the semaphore if it does not already exist
O_CLOEXEC , // close on execute
S_IRWXU | // permissions: user
S_IRWXG | // permissions: group
S_IRWXO , // permissions: other
1 ); // initial value of the semaphore
Voici comment je le décrémente :
struct timespec timeout = { 0, 0 };
clock_gettime( CLOCK_REALTIME, &timeout );
timeout.tv_sec += 5;
if ( sem_timedwait( sem, &timeout ) )
{
throw "timeout while waiting for semaphore";
}