我有一些非常基本的信号量代码在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);
}
使用g ++在OS X上进行编译会返回以下输出:
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会返回如此奇怪的结果......
我尝试使用文件路径作为信号量名称,它没有什么区别。
我很感激我能得到的任何帮助。
答案 0 :(得分: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);
}
答案 1 :(得分:6)
$ 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 :(得分:2)
好吧,也许sem_open()失败了 - 你没有测试过。
或者,也许OSX不默认支持共享posix sems - 如果没有挂载/ dev / shm,通常系统不支持sem_open()。
您可能想要使用SysV信号量。
有关Slackware的类似问题在这里被问到:how-do-i-stop-semopen-failing-with-enosys
然而,进一步的搜索显示OSX名为semaphones是建立在Mach信号量之上的,当你完成时你可能需要sem_unlink()它们(不仅仅是sem_close(),或者可能代替),你应该小心关于权限 - 我建议从0777或0700开始,而不是0。请参阅posiz semaphores in Darwin