我有一段代码:
if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
} 每当我将这个数字设置为任何高于2048年的值时,我都会得到这样的错误:
shmget: Invalid argument然而,当我运行cat /proc/sys/kernel/shmall时,我得到了4294967296。
有人知道为什么会这样吗?提前感谢!
发布于 2014-02-24 11:54:52
曾傑瑞的评论是正确的,即使你没有玩过这个东西,也是很神秘的:“这个:EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.怎么样?”
他的意思是,这部分已经存在了--这些部分是持久的--而且它有2048号大小。
你可以在其他的例子中看到:
$ ipcs -m您也可以删除您的段(注意:只删除您的一个)使用:
$ ipcrm -M <key>在此之后,您应该能够创建更大的。
发布于 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共享内存段的最大数量。请检查一下你们没有违反任何一项。注意,shmmax和SHMMAX是以字节为单位的,shmall和SHMALL是在页数中(页面大小通常是4KB,但应该使用sysconf(PAGESIZE))。我个人觉得你的shmall太大了(2**32页,== 16 TB),但不确定它是否有害。
关于SHMALL的定义,我在我的Ubuntu12.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 */https://stackoverflow.com/questions/21977482
复制相似问题