免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4285 | 回复: 6

[函数] shm_open莫名其妙返回失败 [复制链接]

论坛徽章:
0
发表于 2014-07-24 15:32 |显示全部楼层
    snprintf(szFilePath, sizeof(szFilePath), "/tmp/%s", name);
    iShmID = shm_open( szFilePath, O_RDWR|O_CREAT, 0644); //iMode );
    if( -1 == iShmID )
    {
            printf("CreateShm() : shm_open failed(%d) : %s\n", errno, szFilePath);
            return false;
    }
执行时总是
>./test
CreateShm() : shm_open failed(2) : /tmp/MySHM
错误码是2,
ENOENT An attempt was made to shm_open() a name that did not exist, and O_CREAT was not specified.
怎么看也找不到原因,手工touch创建一个空文件没问题,不是文件或目录权限的问题

论坛徽章:
289
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2014-07-24 15:34 |显示全部楼层
shm_open的名称要求是  /name 这种格式的

论坛徽章:
289
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2014-07-24 15:36 |显示全部楼层
你想在tmp目录下,可以用open

论坛徽章:
0
发表于 2014-07-24 15:55 |显示全部楼层
多谢,是这个原因
问个相关的问题。你知道boost里的 managed_shared_memory 怎么实现的吗,它可以在共享内存里面创建一个map对象,另一个进程连接共享内存以后也能操作该map对象

论坛徽章:
289
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2014-07-24 16:02 |显示全部楼层
remark 发表于 2014-07-24 15:55
多谢,是这个原因
问个相关的问题。你知道boost里的 managed_shared_memory 怎么实现的吗,它可以在共享内 ...


没用过也没研究过boost。
我想要到达这个目的,至少要自己定义allocator,让map使用共享内存。

论坛徽章:
0
发表于 2014-07-24 16:05 |显示全部楼层
回复 5# hellioncu

我试着用placement new把map放到自建的共享内存上,但另一个进程访问数据时就会报内存错误,想知道boost是怎么干的

   

论坛徽章:
289
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2014-07-24 16:14 |显示全部楼层
remark 发表于 2014-07-24 16:05
回复 5# hellioncu

我试着用placement new把map放到自建的共享内存上,但另一个进程访问数据时就会报内 ...


往map插入新节点,会调用allocator,缺省在内存中分配的,你得自己写个allocator,让map的新节点放在共享内存中,没这么做肯定不行。

不过我建议不要这么做,共享内存还是放简单的数据结构为好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP