關於linux共享記憶體中的乙個重要函式shmget

2021-06-16 18:30:02 字數 1731 閱讀 8639

#include

#include

int shmget(key_t key,size_size,int shm***);  //這個是函式shmget的原型。

首先解釋一下值與你所寫的一樣,可以取得共享記憶體識別符號;2.若沒有發現這個key值,則建立乙個共享記憶體並返回共享記憶體識別符號。

key_t key

key識別符號共享記憶體的鍵值:0/ipc_private。當key的取值為ipc_private,則函式shmget(ipc_private)將建立一塊新的共享記憶體;如果key值取0,而引數shm***中設定了ipc_private這個標誌,則同樣將建立一塊新的共享記憶體。

現在解釋一下什麼是鍵值,在ipc的通訊模式下,不管是使用訊息佇列還是共享記憶體,甚至是訊號量,每個ipc的物件(object)都有唯一的名字,稱為「鍵」(key)。通過「key」,程序能夠識別所用的物件。「鍵」與ipc物件的關係就如同檔名稱之於檔案,通過檔名,程序能夠讀寫檔案內的資料,甚至多個程序能夠共用乙個檔案。而在ipc的通訊模式下,通過"鍵「的使用也使得乙個ipc物件能為多個程序所共用。

linux系統中的所有表示system v中ipc物件的資料結構都包括乙個ipc_perm結構,其中包含有ipc物件的鍵值,該鍵用於查詢system v中ipc物件的引用識別符號。如果不使用「鍵」,程序將無法訪問ipc物件,因為ipc物件並不存在於程序本身使用的記憶體中。

通常,都希望自己的程式能和其他的程式預先約定乙個唯一的鍵值,但實際上並不是總可能的成行的,因為自己的程式無法為一塊共享記憶體選擇乙個鍵值。因此,在 此把

key設為ipc_private,這樣,作業系統將忽略鍵,建立乙個新的共享記憶體,指定乙個鍵值,然後返回這塊共享記憶體ipc識別符號id。而將這個 新的共享記憶體的識別符號id告訴其他程序可以在建立共享記憶體後通過派生子程序,或寫入檔案或管道來實現。

int size(單位位元組byte)
size是要建立共享記憶體的長度。所有的記憶體分配操作都是以頁為單位的(這個我以前從沒聽說過)。所以一段程序只申請一塊只有乙個位元組的記憶體,記憶體也會分配整整一頁。這樣的話,新建立的共享記憶體的大小實際上是從size這個引數調整而來的頁面大小。例如size為1至4096,則實際申請到的共享記憶體大小為4k(一頁),在i386機器中一頁的預設大小pace_size=4096位元組,並依此類推。
int shm***
shm***主要和一些標誌有關。其中包括ipc_creat和ipc_excl。
ipc_creat  如果共享記憶體不存在,則建立乙個共享記憶體,如果共享記憶體存在,則執行開啟操作。
ipc_excl     只有共享記憶體不存在的時候,新的共享記憶體才建立,否則就產生錯誤。
兩種情況:
1.單獨使用ipc_creat,shmget()函式要麼返回乙個已經存在的共享記憶體的操作符,要麼返回乙個新建的共享記憶體識別符號。
2.如果ipc_creat和ipc_excl標誌一起使用,shmget()將返回乙個新建的共享記憶體的識別符號;如果該共享記憶體已存在,返回-1。為什麼要兩個標誌一起使用呢?因為它們兩個標誌一起使用可以用來保證所得的物件c是新建的,而不是開啟已有的物件。對於使用者的讀 取和寫入對於使用者的讀 取和寫入許可指定shm_r和shm_w,(shm_r>3)和(shm_w>3)是一組讀取和寫入許可,而(shm_r>6)和(shm_w>6)是全域性讀取和寫入許可.
返回值
成功返回共享記憶體的識別符號;不成功返回-1,errno儲存錯誤原因。

linux中的共享記憶體

int main shm shmat shmid,void 0,0 if shm void 1 printf memory attached at x n int shm shared struct shared use st shm while running else if strncmp bu...

Linux中的程序通訊 共享記憶體

一 什麼是共享記憶體 顧名思義,共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位...

關於MVC View中的乙個坑

問題 datetime轉換,資料庫中receivedate是datetime型別的,在mvc4模型中定義如下 display name 收到日期 public datetime receivedate 檢視中 如下 html.displayfor modelitem item.receivedate...