Question

J'ai un code de sémaphores très basique qui fonctionne très bien sur Linux, mais ne peut pas pour la vie de me le faire fonctionner correctement sur OS X ... Il renvoie le plus étrange des résultats ...

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);

    int value;
    sem_getvalue(test, &value);
    printf("Semaphore initialized to %d\n", value);
}

Compiler ceci sur OS X avec g ++ renvoie la sortie suivante:

iQudsi:Desktop mqudsi$ g++ test.cpp
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to -1881139893

Alors que sur Ubuntu, je reçois le résultat nettement plus sain d'esprit-:

iQudsi: Desktop mqudsi$ g++ test.cpp -lrt
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to 1

Je suis dans ce domaine depuis 3 heures d'affilée, et ne peut pas comprendre pourquoi OS X retourne des résultats bizarres ...

Je l'ai essayé d'utiliser des chemins de fichiers comme le nom sémaphores, il n'a pas fait une différence.

Je vous remercie de toute aide que je pouvais obtenir.

Était-ce utile?

La solution

$ g++ sem-testing.cc -Wall
$ ./a.out 
sem_getvalue: Function not implemented
$ man sem_getvalue
No manual entry for sem_getvalue

Vous utilisez une fonction qui est actuellement pas implémenté sous Mac OS X, et le nombre entier que vous imprimez sur contient les données par défaut que l'entier a été initialisées avec ce qui était probablement des données aléatoires qui était encore en mémoire. Si vous aviez zero'd dehors, en définissant avec vous pourriez avoir int value = 0; attrapé cette erreur plus tôt.

Ce code je (grâce à bdonlan ):

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);
    if (test == SEM_FAILED) {
        perror("sem_open");
        return 1;
    }

    int value;
    if (sem_getvalue(test, &value)) {
        perror("sem_getvalue");
        return 1;
    }
    printf("Semaphore initialized to %d\n", value);
}

Autres conseils

Test Êtes-vous pour des erreurs? Essayez:

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);
    if (test == SEM_FAILED) {
        perror("sem_open");
        return 1;
    }

    int value;
    if (sem_getvalue(test, &value)) {
        perror("sem_getvalue");
        return 1;
    }
    printf("Semaphore initialized to %d\n", value);
}

Eh bien, peut-être sem_open () est un échec - vous ne l'avez pas tester.

Ou, peut-être OSX ne fait pas défaut à soutenir posix partagées sems -. Si / dev / shm n'est pas monté, généralement le système ne supporte pas sem_open ()

Vous pouvez utiliser sémaphores SysV.

Une question similaire concernant Slackware a été posée ici: how-do- i-stop-semopen-défaut-with-ENOSYS

Cependant, des recherches plus poussées montre OSX nommé semaphones sont construits sur le dessus de Mach sémaphores, et vous devez probablement les sem_unlink () lorsque vous avez terminé (et pas seulement sem_close (), ou peut-être à la place), et vous devez être prudent sur les autorisations - Je suggère commençant par 0777 ou 0700 peut-être, au lieu de 0. Voir posiz sémaphores à Darwin

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top