2014-02-24 92 views
1

我有這樣的代碼片段:shmget的大小限制的問題

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

每當我設置任何高於2048的數字,我收到一個錯誤,指出: shmget的:無效的參數

然而,當我運行cat/proc/sys/kernel/shmall,我得到了4294967296.有人知道爲什麼會發生這種情況嗎?提前致謝!

+2

這是怎麼回事:'EINVAL:...給定密鑰存在的段,但大小大於該段的大小。「 –

+0

我把它硬編碼爲512,並且我正在釋放它,所以我沒有認爲這就是發生了什麼。 – user1023465

+0

你知道一種以編程方式在C++中獲得SHMALL的方式,所以我可以用它替換硬編碼的值嗎?當我嘗試使用它時出現此錯誤: parse.cpp:135:錯誤:'SHMALL'未在此範圍內聲明我已包括 user1023465

回答

2

從傑裏的評論是正確的,即使隱祕如果你還沒有這個東西發揮:「這個什麼:EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.

他的意思是段已經存在 - 這些部分是持久的 - 它有大小2048

你可以看到其他的人與中:

$ ipcs -m 

,你可以刪除你的細分:用(注意只刪除您的一個):

$ ipcrm -M <key> 

之後,你應該能夠創建更大。

+0

這正是我所尋找的ipcrm -M命令修好了,非常感謝! – user1023465

1

man 5 proc指涉及shmget(2)三個變量:

  • /proc/sys/kernel/shmall
    This file contains the system-wide limit on the total number of pages of System V shared memory.
  • /proc/sys/kernel/shmmax
    This file can be used to query and set the run-time limit on the maximum (System V IPC) shared memory segment size that can be created. Shared memory segments up to 1GB are now supported in the kernel. This value defaults to SHMMAX.
  • /proc/sys/kernel/shmmni
    (available in Linux 2.4 and onward) This file specifies the system-wide maximum number of System V shared memory segments that can be created.

請檢查您違反了沒有。請注意,shmmaxSHMMAX以字節爲單位,並且shmallSHMALL在頁數中(頁面大小通常爲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 */