shmget
#include
#include int shmget(key_t key,
size_t size, int shm***);
key_t key
key標識共享記憶體的鍵值: 0/ipc_private。 當key的取值為ipc_private,則函式shmget()將建立一塊新的共享記憶體;如果key的取值為0,而引數shm***中設定了ipc_private這個標誌,則同樣將建立一塊新的共享記憶體。 在ipc的通訊模式下,不管是使用訊息佇列還是共享記憶體,甚至是
訊號量,每個ipc的物件(object)都有唯一的名字,稱為「鍵」(key)。通過「鍵」,程序能夠識別所用的物件。「鍵」與ipc物件的關係就如同檔名稱之於檔案,通過檔名,程序能夠讀寫檔案內的資料,甚至多個程序能夠共用乙個檔案。而在ipc的通訊模式下,通過「鍵」的使用也使得乙個ipc物件能為多個程序所共用。 linux系統中的所有表示systemv中ipc物件的
資料結構都包括乙個ipc_perm結構,其中包含有ipc物件的鍵值,該鍵用於查詢systemv中ipc物件的引用
識別符號。如果不使用「鍵」,程序將無法訪問ipc物件,因為ipc物件並不存在於程序本身使用的記憶體中。 通常,都希望自己的程式能和其他的程式預先約定乙個唯一的鍵值,但實際上並不是總可能的成行的,因為自己的程式無法為一塊共享記憶體選擇乙個鍵值。因此,在此把key設為ipc_private,這樣,
作業系統將忽略鍵,建立乙個新的共享記憶體,指定乙個鍵值,然後返回這塊共享記憶體ipc識別符號id。而將這個新的共享記憶體的識別符號id告訴其他程序可以在建立共享記憶體後通過派生子程序,或寫入檔案或管道來實現。
int size(單位位元組byte)
size是要建立共享記憶體的長度。所有的記憶體分配操作都是以頁為單位的。所以如果一段程序只申請一塊只有乙個位元組的記憶體,記憶體也會分配整整一頁(在i386機器中一頁的預設大小pace_size=4096位元組)這樣,新建立的共享記憶體的大小實際上是從size這個引數調整而來的頁面大小。即如果size為1至4096,則實際申請到的共享記憶體大小為4k(一頁);4097到8192,則實際申請到的共享記憶體大小為8k(兩頁),依此類推。
int shm***
shm***主要和一些標誌有關。其中有效的包括ipc_creat和ipc_excl,它們的功能與open()的o_creat和o_excl相當。 ipc_creat 如果共享記憶體不存在,則建立乙個共享記憶體,否則開啟操作。 ipc_excl 只有在共享記憶體不存在的時候,新的共享記憶體才建立,否則就產生錯誤。 如果單獨使用ipc_creat,shmget()函式要麼返回乙個已經存在的共享記憶體的操作符,要麼返回乙個新建的共享記憶體的識別符號。如果將ipc_creat和ipc_excl標誌一起使用,shmget()將返回乙個新建的共享記憶體的識別符號;如果該共享記憶體已存在,或者返回-1。ipc_exel標誌本身並沒有太大的意義,但是和ipc_creat標誌一起使用可以用來保證所得的物件是新建的,而不是開啟已有的物件。對於使用者的讀取和寫入許可指定shm_r和shm_w,(shm_r>3)和(shm_w>3)是一組讀取和寫入許可,而(shm_r>6)和(shm_w>6)是全域性讀取和寫入許可。
需要注意的是,使用引數要加上 | 0666 作為校驗,在有些linux系統中,如果不加此校驗,則不能順利獲取共享空間的值(如ubuntu)。此外,有兩個常用引數,一般要同時出現,他們是:s_irush | s_iwusr 。由於這兩個引數非常常用,程式設計師一般做這樣的操作
#define perm s_irusr | s_iwusr | ipc_creat
這樣一來,第三個引數就可以直接用perm來表示了!成功返回共享記憶體的識別符號;不成功返回-1,errno儲存錯誤原因。
einval 引數size小於shmmin或大於shmmax。
eexist 預建立key所致的共享記憶體,但已經存在。
eidrm 引數key所致的共享記憶體已經刪除。 enospc 超過了系統允許建立的共享記憶體的最大值(shmall )。 enoent 引數key所指的共享記憶體不存在,引數shm***也未設ipc_creat位。
eacces 沒有許可權。 enomem 核心記憶體不足。
struct shmid_ds
shmid_ds資料結構表示每個新建的共享記憶體。當shmget()建立了一塊新的共享記憶體後,返回乙個可以用於引用該共享記憶體的shmid_ds資料結構的識別符號。
include/linux/shm.h
struct shmid_ds
; struct ipc_perm
對於每個ipc物件,系統共用乙個struct ipc_perm的資料結構來存放許可權資訊,以確定乙個ipc操作是否可以訪問該ipc物件。
struct ipc_perm
;
shmget物理記憶體 shmget共享記憶體
linux為共享記憶體提供了四種操作。1.共享記憶體物件的建立或獲得。與其它兩種ipc機制一樣,程序在使用共享記憶體區域以前,必須通過系統呼叫sys ipc call值為shmget 建立乙個鍵值為key的共享記憶體物件,或獲得已經存在的鍵值為key的某共享記憶體物件的引用識別符號。以後對共享記憶體...
程序間通訊 共享記憶體(shmget)
資料出處 當然只有mmap是可以的,不過由於各種不同的系統的架構不一樣,後來又經過整合,所以我們現在的linux有多種記憶體共享方案,下面在介紹一種非常常用的系統v記憶體方案。本人首先再在上次的基礎之上介紹乙個 國防科大的仁兄 本人在自己理解的基礎上一步一步去深入 include include i...
程序間通訊 共享記憶體 shmget
介紹這一部分主要從它的幾個函式入手 概念 共享記憶體是在物理記憶體上開闢一塊區域,這段被多個程序對映到自己程序的虛擬位址空間上,這些程序就可以直接訪問該共享記憶體區域,從而通過該區域實現各程序間的通訊。共享記憶體是程序間最快的一種通訊方式,乙個程序向共享記憶體上面寫資料,共享這塊記憶體的所有程序都可...