Mac Os X et les semaphores

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

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s