首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shmget大小限制问题

shmget大小限制问题
EN

Stack Overflow用户
提问于 2014-02-24 01:48:16
回答 2查看 4.9K关注 0票数 2

我有一段代码:

代码语言:javascript
复制
if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{   
    perror("shmget");
    exit(1);
}   

每当我将这个数字设置为任何高于2048年的值时,我都会得到这样的错误:

代码语言:javascript
复制
shmget: Invalid argument

然而,当我运行cat /proc/sys/kernel/shmall时,我得到了4294967296

有人知道为什么会这样吗?提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-24 11:54:52

曾傑瑞的评论是正确的,即使你没有玩过这个东西,也是很神秘的:“这个:EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.怎么样?”

他的意思是,这部分已经存在了--这些部分是持久的--而且它有2048号大小。

你可以在其他的例子中看到:

代码语言:javascript
复制
$ ipcs -m

您也可以删除您的段(注意:只删除您的一个)使用:

代码语言:javascript
复制
$ ipcrm -M <key>

在此之后,您应该能够创建更大的。

票数 4
EN

Stack Overflow用户

发布于 2014-02-24 07:14:19

man 5 proc指与shmget(2)相关的三个变量

  • /proc/sys/kernel/shmall 此文件包含系统范围内对System共享内存总页数的限制。
  • /proc/sys/kernel/shmmax 此文件可用于查询和设置可创建的最大共享内存段大小(System )的运行时间限制。内核现在支持最多1GB的共享内存段。此值默认为SHMMAX。
  • /proc/sys/kernel/shmmni (在Linux2.4和更高版本中可用)该文件指定了系统范围内可以创建的System共享内存段的最大数量。

请检查一下你们没有违反任何一项。注意,shmmaxSHMMAX是以字节为单位的,shmallSHMALL是在页数中(页面大小通常是4KB,但应该使用sysconf(PAGESIZE))。我个人觉得你的shmall太大了(2**32页,== 16 TB),但不确定它是否有害。

关于SHMALL的定义,我在我的Ubuntu12.04 x86_64系统上得到了这个结果:

代码语言:javascript
复制
$ ack SHMMAX /usr/include
/usr/include/linux/shm.h
9: * SHMMAX, SHMMNI and SHMALL are upper limits are defaults which can
13:#define SHMMAX 0x2000000              /* max shared seg size (bytes) */
16:#define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16))

/usr/include/linux/sysctl.h
113:    KERN_SHMMAX=34,         /* long: Maximum shared memory segment */
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21977482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档