免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5606 | 回复: 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创建一个空文件没问题,不是文件或目录权限的问题

论坛徽章:
324
射手座
日期: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 这种格式的

论坛徽章:
324
射手座
日期: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对象

论坛徽章:
324
射手座
日期: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是怎么干的

   

论坛徽章:
324
射手座
日期: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的新节点放在共享内存中,没这么做肯定不行。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP