Si vous essayez d’utiliser les sémaphores Posix sous Mac Os X, vous n’etes pas a l’abri de certaines surprises, en effet leur implementation au niveau du XNU (le kernel) n’est pas complete.
C’est ce qui m’est arrivé en essayant d’utiliser la fonction sem_getvalue dans du code, et a ma surprise celle ci se comportait toujours pareil et renvoyée 0 dans tous les cas, alors qu’elle est censé retournée la valeur courante du semaphore.
Voici un petit exemple :
#include <stdio.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define SEM_NAME "/my_semaphore"
int main(int argc, char **argv)
{
sem_t *sem;
int val;
sem = sem_open(SEM_NAME, O_CREAT|O_EXCL, 0600, 32);
if(sem == SEM_FAILED)
{
perror("unable to create semaphore");
sem_unlink(SEM_NAME);
exit( -1 );
}
sem_wait(sem);
sem_getvalue(sem, &val);
printf("The sem currente value = %d\n", val);
/* Close the semaphore */
sem_close(sem);
/* Remove the semaphore */
sem_unlink(SEM_NAME);
exit( 0 );
}
Ensuite on compile sur une machine Mac Os X et une Linux (histoire de comparer) :
Sur un Mac :
gcc -Wall semcreate.c -o semcreate
Sur un Linux (faut linker a la lib rt « Posix RealTime Library ») :
gcc -Wall semcreate.c -o semcreate -lrt
Lors de l’execution on constate que sous Mac que sem_getvalue renvoie 0 et sous Linux on obtient la bonne valeur : 31.
Je regarde donc du coté de XNU :
http://opensource.apple.com/source/xnu/xnu-1699.24.8/bsd/kern/posix_sem.c
et la je vois clairement qu’il y a 3 routines qui ne sont pas implementées au niveau du kernel d’Os X, il s’agit de :
- sem_init
- sem_destroy
- sem_getvalue
Si vous faites donc des devs sous Mac evitez ces fonctions jusqu’a nouvel ordre:).
