shmget大小限制问题

时间:2014-02-24 01:48:17

标签: c++ shared-memory

我有这段代码:

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

每当我将数字设置为高于2048时,我得到的错误是:

shmget: Invalid argument

但是当我运行cat /proc/sys/kernel/shmall时,我得到4294967296

有人知道为什么会这样吗?提前谢谢!

2 个答案:

答案 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共享内存段数。
  •   

请检查您是否违反了他们。请注意,shmmaxSHMMAX以字节为单位,shmallSHMALL在页数中(页面大小通常为4 KB,但您应使用{{1} 。)我个人觉得你的sysconf(PAGESIZE)太大了(2 ** 32页== 16 TB)但不确定它是否有害。

关于shmall的定义,我在Ubuntu 12.04 x86_64系统上得到了这个结果:

SHMALL