![](/img/trans.png)
[英]sem_open() error: “undefined reference to sem_open()” on linux (Ubuntu 10.10)
[英]sem_open returns 0 under linux
这听起来像是一个微不足道的问题,但我无法轻易找到解决方案。
这是我的代码:
#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 环境中测试了这段代码,它运行良好。
ENOENT
在oflag中未指定O_CREAT
标志,并且不存在具有该名称的信号灯; 或者,已指定O_CREAT
, 但名称格式不正确 。
sem_overview
表示有关信号量名称的信息:
命名信号量由
/somename
形式的名称/somename
; 也就是说,一个以NULL结尾的字符串,最多NAME_MAX-4
(即251个)字符,由一个初始斜杠组成,后跟一个或多个字符,都不是斜杠。
从 GLIBC 2.34 版开始,我遇到了类似的问题。
sem_open
始终返回NULL
并且错误代码设置为ENOENT
(2)。
问题是,在我的 Linux 系统上没有/dev/shm
目录。 从 GLIBC 版本 2.34 开始,此文件夹是使用共享信号量的要求。
来自http://pubs.opengroup.org/onlinepubs/009695399/functions/sem_open.html上的文档
如果name以斜杠字符开头,则使用相同name值调用sem_open()的进程应引用相同的信号量对象,只要该名称没有被删除即可。 如果名称不是以斜杠字符开头,则效果是实现定义的。 除名称中的前导斜杠字符外,斜杠字符的解释是实现定义的。
sem_open()函数的实现者可以定义如果名称不以/开头的情况。 看来linux不允许这样的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.