Нечетное / Неверное sem_getvalue Семафор Поведение в OS X - PullRequest
3 голосов
/ 16 мая 2009

У меня есть очень простой семафорный код, который отлично работает на Linux, но не могу заставить меня нормально работать на OS X ... Он возвращает самые странные результаты ...

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

Компиляция этого на OS X с g ++ возвращает следующий вывод:

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

Принимая во внимание, что на Ubuntu я получаю совершенно более нормальный результат:

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

Я занимался этим 3 часа подряд и не могу понять, почему OS X возвращает такие странные результаты ...

Я пытался использовать пути к файлам в качестве имени семафора, это не имело значения.

Буду признателен за любую помощь, которую смогу получить.

Ответы [ 3 ]

8 голосов
/ 16 мая 2009

Тестируете ли вы на ошибки? Попробуйте:

#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);
}
6 голосов
/ 16 мая 2009
$ g++ sem-testing.cc -Wall
$ ./a.out 
sem_getvalue: Function not implemented
$ man sem_getvalue
No manual entry for sem_getvalue

Вы используете функцию, которая в настоящее время не реализована в Mac OS X, и целое число, которое вы печатаете, содержит данные по умолчанию, с которыми было инициализировано целое число, и, вероятно, случайные данные, которые все еще были в памяти. Если бы вы обнулили его, установив его с int value = 0;, вы могли бы поймать эту ошибку раньше.

Это код, который я использовал (спасибо 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);
}
2 голосов
/ 16 мая 2009

Ну, возможно, sem_open () не работает - вы не тестировали.

Или, возможно, по умолчанию OSX не поддерживает совместное использование sems posix - если / dev / shm не смонтирован, обычно система не поддерживает sem_open ().

Возможно, вы захотите использовать семафоры SysV.

Аналогичный вопрос, касающийся Slackware, был задан здесь: how-do-i-stop-semopen-fail-with-enosys

Однако, дальнейший поиск показывает, что именованные семафоны OSX построены поверх семафоров Маха, и вам, вероятно, потребуется sem_unlink (), когда вы закончите (не просто sem_close () или, возможно, вместо этого), и вы должны быть осторожны о разрешениях - я предлагаю начать с 0777 или, возможно, с 0700 вместо 0. См. семафоры posiz в Дарвине

...