IPC 三 共享記憶體

2021-08-02 09:05:06 字數 2314 閱讀 4904

共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a、b共享記憶體的意思是,同一塊物理記憶體被對映到程序a、b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。

1. 建立共享記憶體(開啟)

#include 

#include

int shmget(key_t key,size_t size,int shm***>;

key(非0整數):為共享記憶體段命名,shmget成功時返回乙個與key相關的記憶體識別符號shm_id(非負整數),失敗時返回-1

size:以位元組為單位指定需要共享的記憶體容量

shm***:許可權標誌,與open函式的mode引數一樣,建立共享記憶體時此引數位可寫成

ipc_creat | 0666

2.啟動程序對共享記憶體的訪問(對映)

第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的位址空間。

#include

#include

void *shmat(int shm_id, const

void *shm_addr, int shm***);

shm_id: 是由shmget 函式返回的共享記憶體標識。

shm_addr:指定共享記憶體連線到當前程序的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。

shm_***:是一組標誌位,通常為0。

shmat 呼叫成功後返回乙個指向共享記憶體第乙個位元組的指標,呼叫失敗返回-1。

3、分離共享記憶體(解除對映)

shmdt函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用。

#include 

#include

int shmdt(const

void *shmaddr);

shmaddr:是shmat函式返回的位址指標

呼叫成功返回0,失敗返回-1。 

4、控制共享記憶體(控制)

#include 

#include

int shmctl(int shm_id, int command, struct shmid_ds *buf);

shm_id:是shmget函式返回的共享記憶體識別符號

command: 控制共享記憶體要採取的操作,可以取以下三個值:

ipc_stat : 把shmid_ds結構體中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值

ipc_set : 如果程序有足夠的許可權,就把共享記憶體當前的關聯值設定為shmid_ds結構體中給出的值

ipc_rmid : 刪除共享記憶體段

buf : 是乙個結構體指標,指向共享記憶體模式和訪問許可權的結構體

shmid_ds結構體的成員至少包括:

struct shmid_ds

;

呼叫成功返回0,失敗返回-1

一般對記憶體區域的操作是先開啟-》對映-》(操作)-》(控制)-》解除對映。 

shm.h

#ifndef _shm_

#define _shm_

#include

#include

#include

#include

#include

#define _path_ "."

#define _project_ 8888

#define _shm_size_ 4*1024

int get_shm();

char *at_shm();

int delete_shm();

int rm_shm();

#endif

shm.c

#include "shm.h"

int get_shm()

else

return shm_id;

}char *at_shm(int shm_id)

int delete_shm(char* addr)

int rm_shm(int shm_id)

int main()

else

if(id==0)

buf[4096]= '\0';

delete_shm(buf);

}else

return

0;}

IPC 共享記憶體

共享記憶體 shared memory 是最簡單的程序間通訊方式,它允許多個程序訪問相同的記憶體,乙個程序改變其中的資料後,其他的程序都可以看到資料的變化。共享記憶體是程序間最快速的通訊方式 程序共享同一塊記憶體空間。訪問共享記憶體和訪問私有記憶體一樣快。不需要系統呼叫和核心入口。不造成不必要的記憶...

IPC 共享記憶體

a 意義 多個程序共享一部分物理記憶體。訪問快,方便 b 先建立共享記憶體 int shmget key t key,int size,int shm 1.key 標誌共享記憶體的鍵值 0 ipc private a key 0 a 意義 多個程序共享一部分物理記憶體。訪問快,方便 b 先建立共享記...

IPC 共享記憶體

程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址。共享記憶體並未提供同步機制,使用訊號量進行同步。共享記憶體的特點 1 共享記憶體是程序間共享資料的一種最快的方法。乙個程序向共享的記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。2...