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会返回如此奇怪的结果......
我尝试使用文件路径作为信号量名称,它没有什么区别.
我很感激能得到的任何帮助.
你在测试错误吗?尝试:
#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)
$ 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)