Frage

Ich habe einige sehr grundlegende Semaphor-Code, der auf Linux funktioniert gut, kann aber von mir nicht für das Leben bekommen es richtig auf OS X zu laufen ... Sie gibt die seltsamsten Ergebnisse ...

#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);
}

Das Kompilieren dieses auf OS X mit g ++ die folgende Ausgabe zurück:

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

Während auf Ubuntu, erhalte ich die entschieden mehr-sane Ergebnis:

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

Ich habe für 3 Stunden direkt auf diese gewesen und kann nicht herausfinden, warum OS X ist so bizarr Ergebnisse der Rückkehr ...

Ich habe versucht, die Dateipfade als Semaphore Namen, es hat keinen Unterschied machen.

ich jede Hilfe dankbar würde ich bekommen konnte.

War es hilfreich?

Lösung

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

Sie verwenden eine Funktion, die derzeit nicht in Mac OS X implementiert ist, und die ganze Zahl Sie den Ausdruck sind enthält die Standarddaten, dass die ganze Zahl, mit der initialisiert wurde, war wahrscheinlich Zufallsdaten, die noch in Erinnerung war. Haben Sie zero'd es aus, indem sie sie mit int value = 0; Einstellung, die Sie diesen Fehler gefangen haben könnten früher.

Dies ist der Code, den ich verwenden (dank 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);
}

Andere Tipps

Testen Sie auf Fehler? Versuchen Sie:

#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);
}

Nun, vielleicht sem_open () versagt - Sie nicht getestet.

Oder vielleicht OSX nicht standardmäßig geteilt Posix sems zu unterstützen -. Wenn / dev / shm nicht montiert ist, in der Regel das System nicht sem_open unterstützen ()

Sie möchten SysV Semaphore verwenden.

Eine ähnliche Frage in Bezug auf Slackware wurde hier gefragt: wie-do- i-stop-semopen versagende-mit-ENOSYS

Allerdings weitere Suche zeigt OSX genannt semaphones oben auf Mach Semaphore gebaut werden, und Sie müssen wahrscheinlich sem_unlink (), um sie, wenn Sie fertig sind (nicht nur sem_close (), oder vielleicht statt), und Sie sollten vorsichtig sein, zu Berechtigungen - ich schlage vor, mit 0777 oder vielleicht 0700, anstelle von 0. Siehe posiz Semaphore in Darwin

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top