我有一些非常基本的信号码工作的巨大对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是返还这类奇怪的结果...

我试图使用文件的路径的信号名称,它并没有做出差异。

我感谢所有帮助我可以得到的。

有帮助吗?

解决方案

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

您使用的是目前没有在Mac OS X实现的功能,而你打印出整数包含默认数据整数与该初始化可能是当时仍是在内存中的随机数据。假如你zero'd出来,用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);
}

其他提示

您测试的错误?尝试:

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

好吧,也许sem_open()是没有-你没有试验。

或者,也许OS x并不默认支持共同posix中小型企业-如果/dev/shm不安,通常该系统不会支持sem_open().

你可能想要使用SysV信号灯。

一个类似的问题要多得多被要求在这里: 怎么做-我-停止-semopen-没-有-enosys

然而,进一步搜索显示OS x命名semaphones是建立在马赫信号灯,你可能需要sem_unlink()他们当你做完(不仅仅是sem_close(),或者相反),以及你应该小心有关权限-我建议从0777或许0700,而不是0.看看 posiz信号灯在达尔文

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top