程序間通訊之共享記憶體篇

2021-08-22 06:10:27 字數 2548 閱讀 8056

共享記憶體是最快的ipc形式,一旦這樣的記憶體對映到共享它的程序的位址空間。這些程序間資料傳遞不再涉及到核心,換句話說是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。

共享記憶體沒有任何的同步與互斥機制,所以要使用訊號量來實現對共享記憶體的訪問的同步。

如上圖,所謂共享記憶體,把程序的虛擬位址中的某一塊通過頁表的資料結構對映到共同的物理記憶體上,若有兩個程序,假設通過程序1修改記憶體內容,程序2可以看到,因為本質上是同一塊空間,實際上這樣就完成通訊了。

以下是共享記憶體的相關函式介面:

shmget() 函式:用來建立共享記憶體

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

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

size:共享記憶體的大小

shm***:由9個許可權標誌組成,他們的用法和建立檔案時使用的mode模式標誌是一樣的

成功返回該共享記憶體段的標識碼,失敗返回-1.

shmat()函式:將虛擬記憶體的某個空間與共享記憶體建立關聯

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

shmid:共享記憶體標識。

shmaddr:指定連線的位址。

shm***:兩個可能取值是shm_rnd和shm_rdonly

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

shmdt()函式:解除關聯

int shmdt(const void*shmaddr);

當乙個程序不需要共享記憶體的時候,就需要解除關聯。共享記憶體段與當前程序脫離不等於刪除共享記憶體段。

shmaddr:shmat所返回的指標

返回值:成功返回0,並將shmid_ds結構體中的 shm_nattch計數器減1;失敗返回-1。

shmctl()函式:用於控制共享記憶體

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

shmid:由shmget返回的共享記憶體標識碼。

cmd:指定的執行操作,設定為ipc_rmid時表示可以刪除共享記憶體。

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

返回值:成功返回0,失敗返回-1。

共享記憶體的例項**:

makefile

.phony:all

all:server

client

client:client.c common.c

gcc -o $@ $^

server:server.c common.c

gcc -o $@ $^

.phony:clean

clean:

rm -f server

client

#comm.h

ifndef _comm_h

#define _comm_h

#include

#include

#include

#include

#define pathname "."

#define proj_id 0x6666

int creatshm(int size);

int getshm(int size);

int destroyshm(int shmid);

#endif

comm.c

#include "comm.h"

static

int commshm(int size,int flags)

int shmid = 0;

if((shmid = shmget(_key,size,flags)) < 0)

return shmid;

}int creatshm(int size)

int getshm(int size)

int destroyshm(int shmid)

return0;}

server.c

#include "comm.h"

int main()

shmdt(buf);

sleep(2);

destroyshm(shmid);

return0;}

client.c

#include "comm.h"

int main()

shmdt(buf);

sleep(2);

return

0;}

共享記憶體小結:雙向通訊

用於隨意程序

不存在面向位元組流或面向資料塊的概念

沒有同步互斥

生命週期隨核心

Linux程序間通訊之共享記憶體篇

共享記憶體 共享記憶體是lunix系統中最底層的通訊機制,也是最快的通訊機制。共享記憶體通過兩個或多個程序共享同一塊記憶體區域來實現程序間的通訊,就如同 malloc 函式向不同程序返回了指向同乙個物理記憶體區域的指標。通常是由乙個程序建立一塊共享記憶體區域,然後多個程序可以對其進行訪問,乙個程序將...

程序間通訊之共享記憶體

此程式實現兩個普通程序間通過共享記憶體來進行通訊,共享記憶體能夠進行大資料量的通訊,這一點事訊息佇列無法比擬的。在這裡同時使用了訊號量來保證兩個程序間的讀寫同步。傳送端源 include include include include include include include include ...

程序間通訊之共享記憶體

1.概念 共享記憶體就是多個程序的位址空間對映到同乙個物理記憶體,多個程序都能看到這塊物理記憶體,共享記憶體可以提供給伺服器程序和客戶程序之間進行通訊,不需要進行資料的複製,所以速度最快。2.共享記憶體操作需要的函式 1 我們需要利用ftok函式生成key識別符號。key t ftok const ...