我有这段代码:
if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
}
每当我将数字设置为高于2048时,我得到的错误是:
shmget: Invalid argument
但是当我运行cat /proc/sys/kernel/shmall
时,我得到4294967296
。
有人知道为什么会这样吗?提前谢谢!
答案 0 :(得分:2)
Jerry的评论是正确的,即使你没有玩过这些东西也很神秘:“这个怎么样:EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.
”
他的意思是该片段已经存在 - 这些片段是持久的 - 它的大小为2048.
你可以在其他人中看到它:
$ ipcs -m
你可以删除你的片段(注意:只删除你的片段):
$ ipcrm -M <key>
之后你应该能够把它做得更大。
答案 1 :(得分:1)
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,但您应使用{{1} 。)我个人觉得你的sysconf(PAGESIZE)
太大了(2 ** 32页== 16 TB)但不确定它是否有害。
关于shmall
的定义,我在Ubuntu 12.04 x86_64系统上得到了这个结果:
SHMALL