shmget() - Unix,Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

shmget() - Unix,Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

shmget - 分配共享記憶體段

語法

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

描述

shmget() 返回與引數 key 的值關聯的共享記憶體段的識別符號。如果 key 的值為 IPC_PRIVATE,則建立一個新的共享記憶體段,其大小等於 size 的值向上舍入到 PAGE_SIZE 的倍數;或者如果 key 不為 IPC_PRIVATE,並且不存在與 key 對應的共享記憶體段,並且在 shmflg 中指定了 IPC_CREAT,則建立一個新的共享記憶體段。

如果 shmflg 同時指定了 IPC_CREATIPC_EXCL,並且對於 key 已經存在共享記憶體段,則 shmget() 失敗,並將 errno 設定為 EEXIST。(這類似於 open(2) 的組合 O_CREAT | O_EXCL 的效果。)

shmflg 的值由以下組成:

標籤描述
SHM_HUGETLB 用於為共享記憶體分配 HUGETLB 頁面。IPC_CREAT 用於建立新的段。如果不使用此標誌,則 shmget() 將找到與 key 關聯的段,並檢查使用者是否有權訪問該段。
IPC_EXCL IPC_CREAT 一起使用,以確保如果段已存在則失敗。
mode_flags (最低有效 9 位)指定授予所有者、組和世界的許可權。這些位具有相同的格式和相同的含義,與 open(2) 的 mode 引數相同。目前,系統不使用執行許可權。
SHM_HUGETLB(自 Linux 2.6 起)
 使用“巨型頁面”分配段。有關更多資訊,請參閱核心原始檔 Documentation/vm/hugetlbpage.txt
SHM_NORESERVE(自 Linux 2.6.15 起)
 此標誌與 mmap(2) 的 MAP_NORESERVE 標誌具有相同的用途。不要為該段保留交換空間。當保留交換空間時,可以保證可以修改該段。當不保留交換空間時,如果無法獲得物理記憶體,則寫入時可能會收到 SIGSEGV。另請參閱 proc(5) 中 /proc/sys/vm/overcommit_memory 檔案的討論。
建立新的共享記憶體段時,其內容將初始化為零值,其關聯的資料結構 shmid_ds(參見 shmctl(2))將按如下方式初始化:
標籤描述
shm_perm.cuidshm_perm.uid 設定為呼叫程序的有效使用者 ID。
shm_perm.cgidshm_perm.gid 設定為呼叫程序的有效組 ID。
shm_perm.mode 的最低有效 9 位設定為 shmflg 的最低有效 9 位。
shm_segsz 設定為 size 的值。
shm_lpidshm_nattchshm_atimeshm_dtime 設定為 0。
shm_ctime 設定為當前時間。
如果共享記憶體段已存在,則會驗證許可權,並檢查它是否已標記為要銷燬。

系統呼叫

標籤描述
fork() fork() 之後,子程序繼承附加的共享記憶體段。
exec() exec() 之後,所有附加的共享記憶體段都將分離(不會銷燬)。
exit() exit() 時,所有附加的共享記憶體段都將分離(不會銷燬)。

返回值

成功時返回有效的段識別符號 shmid,錯誤時返回 -1。

錯誤

失敗時,errno 將設定為以下之一:
標籤描述
EACCES 使用者無權訪問共享記憶體段,並且沒有 CAP_IPC_OWNER 許可權。
EEXIST 指定了 IPC_CREAT | IPC_EXCL,並且段存在。
EINVAL 要建立一個新的段,並且 size < SHMMINsize > SHMMAX;或者不建立新的段,具有給定鍵的段存在,但 size 大於該段的大小。
ENFILE 已達到系統開啟檔案的總數限制。
ENOENT 對於給定的 key 不存在段,並且未指定 IPC_CREAT
ENOMEM 無法為段開銷分配記憶體。
ENOSPC 所有可能的共享記憶體 ID 都已被佔用(SHMMNI),或者分配請求的 size 大小的段會導致系統超過共享記憶體的系統範圍限制(SHMALL)。
EPERM 指定了 SHM_HUGETLB 標誌,但呼叫者沒有特權(沒有 CAP_IPC_LOCK 許可權)。

備註

IPC_PRIVATE 不是標誌欄位,而是 key_t 型別。如果將此特殊值用於 key,則系統呼叫將忽略 shmflg 的最低有效 9 位以外的所有內容,並建立一個新的共享記憶體段(成功時)。

以下關於共享記憶體段資源的限制會影響 shmget() 呼叫:

標籤描述
SHMALL 共享記憶體頁面的系統範圍最大值(在 Linux 上,可以透過 /proc/sys/kernel/shmall 讀取和修改此限制)。
SHMMAX 共享記憶體段的最大大小(以位元組為單位):策略相關(在 Linux 上,可以透過 /proc/sys/kernel/shmmax 讀取和修改此限制)。
SHMMIN 共享記憶體段的最小大小(以位元組為單位):實現相關(目前為 1 位元組,儘管 PAGE_SIZE 是有效最小大小)。
SHMMNI 共享記憶體段的系統範圍最大數量:實現相關(目前為 4096,在 Linux 2.3.99 之前為 128;在 Linux 上,可以透過 /proc/sys/kernel/shmmni 讀取和修改此限制)。
實現對每個程序的共享記憶體段的最大數量(SHMSEG)沒有特定限制。

缺陷

名稱選擇 IPC_PRIVATE 可能是不幸的,IPC_NEW 將更清楚地顯示其功能。

符合標準

SVr4、POSIX.1-2001。

Linux 備註

在版本 2.3.30 之前,Linux 會在計劃刪除的共享記憶體段上返回 shmget() 的 EIDRM。

SHM_HUGETLB 是一個非可移植的 Linux 擴充套件。

參見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.