我有这个代码片段:
if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
}
每当我比2048集数任何更高时,我收到一个错误,指出:
shmget: Invalid argument
然而,当我运行cat /proc/sys/kernel/shmall
,我得到4294967296
。
有谁知道为什么发生这种情况? 提前致谢!
我有这个代码片段:
if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
}
每当我比2048集数任何更高时,我收到一个错误,指出:
shmget: Invalid argument
然而,当我运行cat /proc/sys/kernel/shmall
,我得到4294967296
。
有谁知道为什么发生这种情况? 提前致谢!
从杰里的评论是正确的,即使隐秘如果你还没有这个东西发挥:“这个怎么样: EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.
”
他的意思是段已经存在 - 这些部分是持久的 - 它有大小2048。
你可以看到其他的人与中:
$ ipcs -m
你可以删除片段(注意:删除您只有一个)有:
$ ipcrm -M <key>
在此之后,你应该能够创建更大。
男子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共享存储器段的全系统的最大数目。
请检查您违反了没有。 需要注意的是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 */