linux 共享記憶體

2021-08-21 19:55:56 字數 3370 閱讀 5435

共享記憶體區是最快的ipc形式,一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心。

前幾種,核心提供資源,**借助核心,從使用者態切換到核心態,完成之後,又要從核心態切換到使用者態。

共享記憶體是通過mmu機制,直接對映到核心。

共享記憶體的特點

雙向通訊,可用於隨意的程序,不一定非要有親緣關係

沒有面向位元組流或者資料報的概念,就是一塊記憶體,可以隨機訪問

生命週期隨核心,需要人為顯式刪除共享記憶體或者重啟核心。

沒有內建同步互斥機制

檢視系統中存在的共享記憶體

ipcs -m
刪除系統中存在的共享記憶體

ipcrm -m + shmid
和前面兩種程序間通訊類似,共享記憶體也有乙個專門的結構來描述它。

struct shmid_ds ;
先學習有關於共享記憶體的相關函式

shmget 函式

原型: int shmget(key_t key, size_t size, int shm***);

功能: 用來建立或者訪問共享記憶體

引數:

key : 唯一識別符號

size : 建立的共享記憶體的大小,以 4k(頁表的大小) 大小為單位進行分配空間。

shm*** : 標誌位

返回值:

成功返回乙個非負整數,該段的共享記憶體的標誌碼,失敗則返回-1

shmat函式

原型: void *shmat(int shmid, const void *shmaddr, int shm***);

功能: 將共享記憶體對映到程序位址空間

引數:

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 */

shmdt函式

原型 :int shmdt(const void *shmaddr);

功能 :將共享記憶體段與當前程序脫離,並不是刪除這段共享記憶體,只是脫離對映關係

引數 :

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 :刪除共享資料段

common.h

用於封裝為功能性更完整的函式

#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系統執行的每乙個程式,都是乙個程...