sem_open在linux下返回0

时间:2015-04-19 14:32:53

标签: c++ linux semaphore

这听起来像是一个微不足道的问题,但我无法轻易找到解决方案。

这是我的代码:

#include <iostream>
#include <fcntl.h>
#include <semaphore.h>

using namespace std;

int main()
{
    sem_t * my_semaphore = sem_open("./my_semaphore", O_CREAT, 0755, 1);
    cout<<my_semaphore<<endl;
}

这打印出0:信号量没有被创建。我究竟做错了什么?我在OSX环境中测试了这段代码,它运行得很好。

2 个答案:

答案 0 :(得分:4)

sem_open的Linux联机帮助页(补充说明):

  

ENOENT未在oflag中指定O_CREAT标志且没有信号量                 这个名字存在;或者,O_CREAT已指定,但名称                 没有很好的形成

sem_overview说明了信号量名称:

  

命名信号量由表单名称标识   /somename;也就是说,一个以null结尾的字符串   NAME_MAX-4(即251)个字符由一个首字母组成   斜杠,后跟一个或多个字符,其中没有一个    斜杠。

答案 1 :(得分:0)

来自http://pubs.opengroup.org/onlinepubs/009695399/functions/sem_open.html

的文档
  

如果name以斜杠字符开头,则调用具有相同name值的sem_open()的进程应引用相同的信号量对象,只要该名称尚未删除即可。如果name不以斜杠字符开头,则效果是实现定义的。除了名称中的前导斜杠字符之外的斜杠字符的解释是实现定义的。

sem_open()函数的实现者可以定义如果名称不以/开头会发生什么。似乎linux不允许这样的名字。