繁体   English   中英

shmget大小限制问题

[英]shmget size limit issue

我有以下代码片段:

if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{   
    perror("shmget");
    exit(1);
}   

每当我将数字设置为大于2048时,都会出现错误消息:

shmget: Invalid argument

但是,当我运行cat /proc/sys/kernel/shmall ,我得到4294967296

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

即使您还没有玩过这些东西,Jerry的评论也是正确的,即使它是神秘的:“这怎么办: EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.

他的意思是该段已经存在-这些段是持久的-大小为2048。

您可以通过以下方式在其他视图中看到它:

$ ipcs -m

您可以使用以下方法删除细分受众群(注意:仅删除您的细分受众群):

$ ipcrm -M <key>

之后,您应该可以将其创建得更大。

man 5 proc引用与shmget(2)相关的三个变量:

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

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

至于SHMALL的定义,我在Ubuntu 12.04 x86_64系统上得到了以下结果:

$ 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 */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM