[英]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共享内存段的最大数目。
请检查您没有违反任何一项。 请注意, shmmax
和SHMMAX
以字节为单位, shmall
和SHMALL
以页数为单位(页面大小通常为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.