共享記憶體區是最快的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系統執行的每乙個程式,都是乙個程...