程序間通訊之共享記憶體

2021-08-04 07:33:18 字數 2913 閱讀 2932

ipc物件這個概念需要理解,因為好多書或者料就直接說ipc就是共享記憶體、訊息佇列、訊號燈集,其實ipc是一種機制,這種機制提供了程序間通訊的通道,那麼為什麼加個system v呢,那是因為在system v 系統的四個版本中提出的程序通訊的ipc這種機制。所以叫做system v ipc。

目前linux也支援這三種機制:共享記憶體、訊息佇列、訊號燈集

linux核心中定義了乙個結構體:

struct ipc_perm

;

key比較關鍵,是識別這個共享通道的鑰匙。

在這三種機制中都會用到這個建立的key;

一般用 ftok這個函式來建立鑰匙。

key_t ftok( char * fname, int id )

例如:

if ((key = ftok(".", 's')) < 0)

這樣就產生了乙個key,其實也可以自己定義key,但是這樣定義的key不安全。所以盡量用ftok來產生key

共享記憶體,它是一種最為高效的程序間通訊方式,程序可以直接讀寫記憶體,不需要任何資料的拷貝

為了在多個程序間交換資訊,核心專門留出了一塊記憶體區,可以有需要訪問的程序將其對映到自己的私有位址空間,這種機制要

建立在絕對信任的基礎上,否則,如果系統的一些重要資訊放在這塊記憶體區的話,可能會被利用。

程序不需要拷貝,那麼句大大提高了效率,由於多個程序共享一段記憶體,所以也需要依靠某種同步機制,如互斥和訊號量等。

函式所需標頭檔案

#include #include #include
共享記憶體的實現步驟:

##### 1. 建立/開啟共享記憶體

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

函式引數:

- key:ipc_private或ftok的返回值

- size:共享記憶體的大小

- shm***:許可權位

返回值:成功:共享記憶體段識別符號

失敗 -1;

2. 對映共享記憶體,即把指定的共享記憶體對映到程序的位址空間用於訪問

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

函式引數:

- shmid: 要對映的共享記憶體去識別符號

- shmaddr:將共享記憶體對映到指定的位址(若為null,則表示由系統自動完成對映)

- shm***:shm_rdonly 共享記憶體唯讀

預設為0:共享記憶體可讀寫

3. 撤銷共享記憶體對映

int shmdt(const void * shmaddr);

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

4. 刪除共享記憶體物件

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

函式引數:

- shmid:要操作的共享記憶體識別符號

/*******************************write寫端*****************************/

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#define n 64

typedef

struct

shm;

void handler(int signo)

int main()

signal(sigusr1, handler);

if ((shmid = shmget(key, sizeof(shm), 0666|ipc_creat|ipc_excl)) < 0) // not first process

else

}else

// first process

while ( 1 )

shmdt(shmadd);

if (shmctl(shmid, ipc_rmid, null) < 0)

return

0;}

/********************************read讀端*****************************/

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#define n 64

typedef

struct

shm;

void handler(int signo)

int main()

signal(sigusr1, handler);

if ((shmid = shmget(key, sizeof(shm), 0666|ipc_creat|ipc_excl)) < 0) // not first process

else

}else

// first process

while ( 1 )

shmdt(shmadd);

return

0;}

程序間通訊之共享記憶體

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

程序間通訊之共享記憶體

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

程序間通訊之共享記憶體

繼學習過程序間通訊的兩種方式管道和訊息佇列之後,接下來就要學習乙個速度最快的 程序間通訊的方式 共享記憶體。為什麼說共享記憶體是最快的ipc形式呢?因為它省掉了兩次資料拷貝的過程。一旦這樣的記憶體對映到共享 他的程序的位址空間,這些程序間資料傳遞不在涉及到核心 就是程序不在通過執行進入核心的系統呼叫...