这听起来像是一个微不足道的问题,但我无法轻易找到解决方案。
这是我的代码:
#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环境中测试了这段代码,它运行得很好。
答案 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不允许这样的名字。