shmget的大小限制问题(shmget size limit issue)

2019-10-19 09:33发布

我有这个代码片段:

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

每当我比2048集数任何更高时,我收到一个错误,指出:

shmget: Invalid argument

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

有谁知道为什么发生这种情况? 提前致谢!

Answer 1:

从杰里的评论是正确的,即使隐秘如果你还没有这个东西发挥:“这个怎么样: EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.

他的意思是段已经存在 - 这些部分是持久的 - 它有大小2048。

你可以看到其他的人与中:

$ ipcs -m

你可以删除片段(注意:删除您只有一个)有:

$ ipcrm -M <key>

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



Answer 2:

男子5 PROC指的是相关的三个变量shmget(2)

  • /proc/sys/kernel/shmall
    此文件包含对System V共享存储器的页的总数的系统级限制。
  • /proc/sys/kernel/shmmax
    该文件可以被用来查询和设置上的最大运行时间限制(系统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 */


文章来源: shmget size limit issue