免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 42819 | 回复: 5
打印 上一主题 下一主题

新人请教,perl程序中创建共享内存超过65536 * 4时失败 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-02 18:19 |只看该作者 |倒序浏览
本帖最后由 白菜饺子馅 于 2016-08-02 18:23 编辑

由于代码涉及到多线程并发,计划使用共享内存作为通信机制。
数据量挺大,哪怕是临时存储也需要大量空间。
但是创建内存大小超过65536 * 4时就会失败,返回Invalid argument。
linux系统中的限制数值为shmall 2097152(约为65536 * 32)  shmmax 33554432(约为65536 * 512)  shmmni 4096。
查找perl语言相关函数介绍也没有发现说有限制。百度上也没有找到相关信息,搞不清楚怎么回事,还请各位高手不吝赐教。
附上相关代码:
use IPC::SysV qw(IPC_PRIVATE IPC_RMID IPC_CREAT  S_IRUSR S_IWUSR);
    my $mem_size = 65536*4 + 1;
    my $key = "1992";
    my $share = shmget($key,$mem_size ,IPC_CREAT|0777);
    if (!defined($share) or !($share)){
       log("create a shared memory to store the rate failed !\n", "debug";
    }
报错信息为create a shared memory to store the rate failed :Invalid argument

谢谢!

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2016-08-02 20:02 |只看该作者
错误的参数,看样是参数类型错误,或者是少了参数。你好好看看文档

论坛徽章:
0
3 [报告]
发表于 2016-08-03 09:12 |只看该作者
回复 2# 104359176

只是改动了size的数值,如果值为65536 * 4,程序就成功。如果超过这个数值,就返回参数错误。但是这个大小对程序来说是不够用的,而且也没有听说过共享内存大小有限制这回事。
除了perldoc上,不知道哪里还有相关文档。
   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2016-08-03 10:15 |只看该作者
在说明文档中,找不到你要调用函数的名称。shmget(..) 不知道是否导出了。
你可以看看:
http://man.he.net/man2/shmget
看看是不是参数有限制。

论坛徽章:
0
5 [报告]
发表于 2016-08-03 14:27 |只看该作者
回复 4# 104359176

man手册也没发现说参数有限制,至于系统限制,这个我是知道的。
1、您是否知道其他的共享内存的方式?我刚接触perl语言不太久,只知道一些常用方法。
2、perl的内置函数不是单独封装过吗?是直接调用的c库函数吗?

   

论坛徽章:
0
6 [报告]
发表于 2016-08-03 15:33 |只看该作者
回复 4# 104359176
问题解决了,是因为原来的空间没有被释放。用相同的key申请不同大小的空间就会报错。
感谢之间的帮助。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP