我有這樣的代碼片段:shmget的大小限制的問題
if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
}
每當我設置任何高於2048的數字,我收到一個錯誤,指出: shmget的:無效的參數
然而,當我運行cat/proc/sys/kernel/shmall,我得到了4294967296.有人知道爲什麼會發生這種情況嗎?提前致謝!
我有這樣的代碼片段:shmget的大小限制的問題
if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
}
每當我設置任何高於2048的數字,我收到一個錯誤,指出: shmget的:無效的參數
然而,當我運行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>
之後,你應該能夠創建更大。
這正是我所尋找的ipcrm -M命令修好了,非常感謝! – user1023465
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.
請檢查您違反了沒有。請注意,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 */
這是怎麼回事:'EINVAL:...給定密鑰存在的段,但大小大於該段的大小。「 –
我把它硬編碼爲512,並且我正在釋放它,所以我沒有認爲這就是發生了什麼。 – user1023465
你知道一種以編程方式在C++中獲得SHMALL的方式,所以我可以用它替換硬編碼的值嗎?當我嘗試使用它時出現此錯誤: parse.cpp:135:錯誤:'SHMALL'未在此範圍內聲明我已包括和 –
user1023465