簡體   English   中英

shmget大小限制問題

[英]shmget size limit issue

我有以下代碼片段:

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

每當我將數字設置為大於2048時,都會出現錯誤消息:

shmget: Invalid argument

但是,當我運行cat /proc/sys/kernel/shmall ,我得到4294967296

有人知道為什么會這樣嗎? 提前致謝!

即使您還沒有玩過這些東西,Jerry的評論也是正確的,即使它是神秘的:“這怎么辦: EINVAL: ... a segment with given key existed, but size is greater than the size of that segment.

他的意思是該段已經存在-這些段是持久的-大小為2048。

您可以通過以下方式在其他視圖中看到它:

$ ipcs -m

您可以使用以下方法刪除細分受眾群(注意:僅刪除您的細分受眾群):

$ ipcrm -M <key>

之后,您應該可以將其創建得更大。

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,但您應該使用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 */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM