共享記憶體區是最快的ipc形式,一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心。
前幾種,核心提供資源,**借助核心,從使用者態切換到核心態,完成之後,又要從核心態切換到使用者態。
共享記憶體是通過mmu機制,直接對映到核心。
共享記憶體的特點
雙向通訊,可用於隨意的程序,不一定非要有親緣關係
沒有面向位元組流或者資料報的概念,就是一塊記憶體,可以隨機訪問
生命週期隨核心,需要人為顯式刪除共享記憶體或者重啟核心。
沒有內建同步互斥機制
檢視系統中存在的共享記憶體
ipcs -m
刪除系統中存在的共享記憶體
ipcrm -m + shmid
和前面兩種程序間通訊類似,共享記憶體也有乙個專門的結構來描述它。
struct shmid_ds ;
先學習有關於共享記憶體的相關函式
shmget 函式
原型: int shmget(key_t key, size_t size, int shm***);shmat函式功能: 用來建立或者訪問共享記憶體
引數:
key : 唯一識別符號
size : 建立的共享記憶體的大小,以 4k(頁表的大小) 大小為單位進行分配空間。
shm*** : 標誌位
返回值:
成功返回乙個非負整數,該段的共享記憶體的標誌碼,失敗則返回-1
原型: void *shmat(int shmid, const void *shmaddr, int shm***);shmdt函式功能: 將共享記憶體對映到程序位址空間
引數:
shmid : 要對映的共享記憶體的標識
shmaddr :指定連線的位址,一般都是填null,讓作業系統自動對映
shm*** :標誌位
返回值:
成功返回乙個指標,指向共享記憶體的第乙個位元組,失敗返回-1
/* mode for attach */
#define shm_rdonly 010000 /* read-only access */
#define shm_rnd 020000 /* round attach address to shmlba boundary */
#define shm_remap 040000 /* take-over region on attach */
#define shm_exec 0100000 /* execution access */
原型 :int shmdt(const void *shmaddr);common.h功能 :將共享記憶體段與當前程序脫離,並不是刪除這段共享記憶體,只是脫離對映關係
引數 :
shmaddr :指向attach後的位址空間
返回值 :
成功返回0, 失敗返回 -1
shmctl函式
原型 :int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能 : 控制共享記憶體
引數 :
shmid :共享記憶體的標識碼
cmd :要做什麼操作 (ipc_stat、ipc_set、ipc_rmid)
buf :指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構
返回值 :
成功返回0,失敗返回-1
cmd :
ipc_stat :把shmid_ds結構中的資料設定為共享記憶體的當前關聯值
ipc_set :在程序有足夠許可權前提下,把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值
ipc_rmid :刪除共享資料段
用於封裝為功能性更完整的函式
#pragma once
#include
#include
#include
#include
#define pathname "."
#define proj_id 0x1
int createshm(size_t size); // 建立乙個共享記憶體
int getshm(); //獲取乙個共享記憶體
int destroyshm(int shmid); //銷毀乙個共享記憶體
common.c
#include "common.h"
//由於建立和獲取的**基本上一致,就只有shmget的引數有些不同。
//所以就將其封裝。將shmget的引數作為封裝好的函式的引數
int commonshm(size_t size, int flags)
int shmid = shmget(key, size, flags);
if(shmid < 0)
return shmid;
}//建立乙個共享記憶體
int createshm(size_t size)
//獲取乙個共享記憶體
int getshm()
//銷毀一段共享記憶體
int destroyshm(int shmid)
return
0; }
server.c
伺服器端**
#include "common.h"
int main()
printf("shmid : %d\n",shmid);
char *ptr = (char*)shmat(shmid, null, shm_rdonly);
while(1)
shmdt(ptr);
return
0; }
client.c
客戶端**
#include "common.h"
int main()
printf("shmid: %d\n",shmid);
//0 表示
char *ptr = (char*)shmat(shmid, null, 0);
int i = 1;
while(1)
ptr[j] = '\0';
i++;
i %=
26; sleep(1);
}shmdt(ptr);
return
0; }
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系統執行的每乙個程式,都是乙個程...