【问题标题】:sem_open returns 0 under linuxsem_open 在linux下返回0
【发布时间】:2015-04-19 14:32:52
【问题描述】:

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

这是我的代码:

#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 环境中测试了这段代码,它运行良好。

【问题讨论】:

  • 使用perror 找出错误所在。 (在你伤害自己之前放弃using namespace std;。)
  • 好的。它说“没有这样的文件或目录。”。 O_CREAT 标志不是应该让它创建信号量吗...?

标签: c++ linux semaphore


【解决方案1】:

从 GLIBC 2.34 版开始,我遇到了类似的问题。

sem_open 始终返回 NULL 并且错误代码设置为 ENOENT (2)。

问题是,在我的 Linux 系统上没有 /dev/shm 目录。从 GLIBC 版本 2.34 开始,此文件夹是使用共享信号量的要求。

【讨论】:

    【解决方案2】:

    sem_open 的 Linux 联机帮助页说(添加了重点):

    ENOENT O_CREAT 标志未在 oflag 中指定,也没有信号量 同名存在;或者,O_CREAT 已指定,但名称 格式不正确

    sem_overview 关于信号量名称是这样说的:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-07-17
        • 2019-09-26
        • 2021-10-28
        • 1970-01-01
        • 2011-06-22
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        相关资源
        最近更新 更多