OS X上的奇怪/不正确的sem_getvalue信号量行为

Mah*_*dsi 3 c++ macos posix mutex semaphore

我有一些非常基本的信号量代码在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);
}
Run Code Online (Sandbox Code Playgroud)

使用g ++在OS X上编译它会返回以下输出:

iQudsi:Desktop mqudsi$ g++ test.cpp
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to -1881139893
Run Code Online (Sandbox Code Playgroud)

而在Ubuntu上,我获得了更明智的结果:

iQudsi: Desktop mqudsi$ g++ test.cpp -lrt
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to 1
Run Code Online (Sandbox Code Playgroud)

我已经连续3个小时了,并且无法弄清楚为什么OS X会返回如此奇怪的结果......

我尝试使用文件路径作为信号量名称,它没有什么区别.

我很感激能得到的任何帮助.

bdo*_*lan 8

你在测试错误吗?尝试:

#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);
}
Run Code Online (Sandbox Code Playgroud)


X-I*_*nce 6

$ g++ sem-testing.cc -Wall
$ ./a.out 
sem_getvalue: Function not implemented
$ man sem_getvalue
No manual entry for sem_getvalue
Run Code Online (Sandbox Code Playgroud)

您正在使用当前未在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);
}
Run Code Online (Sandbox Code Playgroud)