Linux共享記憶體及共享記憶體API

2021-08-14 22:29:55 字數 1788 閱讀 1701

共享記憶體區是最快的ipc(程序間通訊)形式。

用共享記憶體從伺服器拷貝檔案資料到客戶端:

共享記憶體基本api:

#include

#include

1.     int shmget(key_t key,size_t size,int shm***);

功能:用來建立共享記憶體

key:是這個共享記憶體段的名字

size:共享記憶體的大小

shm***:相當於許可權位(如0666)

返回值是共享記憶體段的標識碼shmid,

例如:shmid = shmget(0x1111, 128, 0666);

//建立共享記憶體 , 相當於開啟開啟檔案 

//若共享記憶體存在 則使用   fopen()

//若共享記憶體 不存在 則報錯 -1

shmid = shmget(0x1111, 128, 0666 | ipc_creat);

//建立共享記憶體 , 相當於開啟開啟檔案 

//若共享記憶體存在 則使用   fopen()

//若共享記憶體 不存在 則建立 

shmid = shmget(0x1111, 128, 0666 | ipc_creat | ipc_excl);

//建立共享記憶體 , 相當於開啟檔案 

//若共享記憶體存在 則報錯

//若共享記憶體 不存在 則建立 

//作用 ipc_excl判斷存在不存在的標誌  避免已經存在的檔案 被覆蓋

2.  void *shmat(int shmid, const void *shmaddr, int shm***);0xaa11

shmaddr:指定連線的位址,因為記憶體位址是段頁式管理,所以有可能傳入的位址並不就是那一頁的開頭位置,所以傳入乙個位址,傳出的仍然是乙個位址,傳出的是具體開始儲存的位址。所以我們通常傳入null,讓編譯器直接分配個合適的位置給我們。

shm***:它的兩個取值可能是shm_rnd和shm_rdonly. 例:

void *p = shmat(shmid, null, 0);

返回值:成功返回乙個指標,指向共享記憶體第乙個節,失敗返回-1;

3, int shmdt(const void *shmaddr);

功能:將共享記憶體段與當前程序脫離,但並不等於刪除共享記憶體段

4,  int shmctl(int shmid,int cmd,struct shmid_ds *buf);

功能:用於控制共享記憶體

cmd:將要採取的動作

1,ipc_stat  把shmid_ds結構中的資料設定為共享記憶體的當前關聯值

2,ipc_set    在程序有足夠許可權的前提下,把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值

3,ipc_rmid  刪除共享記憶體段

buf: 指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

例: shmctl(shmid, ipc_rmid, null);

//刪除共享記憶體

若想要把舊的共享記憶體裡面的內容儲存下來,則傳入乙個位址,用來完成儲存的功能

共享記憶體私有:

linux核心通過引用計數技術來管理共享記憶體生命週期

Linux 共享記憶體

一 概念 共享記憶體是被多個程序共享的一部分物理記憶體,是程序間共享資料的最快的一種方法。二 實現 分為兩個步驟 1 建立共享記憶體。2 對映共享記憶體。1 建立 int shmget key t key,int size,int shm 當key的取值為 ipc private 時,將建立一塊新的...

linux共享記憶體

linux共享記憶體使用 標頭檔案 include 1 建立共享記憶體 int shmget key t key,size t size,int shm 建立成功以後會返回乙個共享記憶體id,建立失敗返回 1。2 獲取共享記憶體 void shmat int shmid,const void shm...

linux 共享記憶體

共享記憶體解決的問題是 任意兩個程序之間的通訊如果是有名管道,是沒有辦法對管道中間的資料獲取讀和寫操作的,只能是兩段的資料,那麼如何對所有的資料進行操作 共享記憶體 共享記憶體也是通過核心來完成 命令 ipcs m p s 共享記憶體的工作機制如下所示 首先linux系統執行的每乙個程式,都是乙個程...