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:).