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

2021-08-18 11:42:36 字數 3460 閱讀 1934

1、共享記憶體概念引入

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

2、共享記憶體資料結構

struct shmid_ds {

struct ipc_perm     shm_perm;   /* operation perms */

int         shm_segsz;  /* size of segment (bytes) */

__kernel_time_t     shm_atime;  /* last attach time */

__kernel_time_t     shm_dtime;  /* last detach time */

__kernel_time_t     shm_ctime;  /* last change time */

__kernel_ipc_pid_t  shm_cpid;   /* pid of creator */

__kernel_ipc_pid_t  shm_lpid;   /* pid of last operator */

unsigned short      shm_nattch; /* no. of current attaches 

unsigned short      shm_unused; /* compatibility */

void            *shm_unused2;   /* ditto - used by dipc */

void            *shm_unused3;   /* unused */

3、先來介紹一下共享記憶體所需要的函式

(1)shmget函式

函式原型:

#include

#include

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

功能:用來建立共享記憶體

引數解釋:

引數一:這個共享記憶體段名字

引數二:共享記憶體大小

引數三:許可權位,有九個選項,與建立檔案時的許可權相同

返回值;

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

(2)shmat函式

函式原型:

#include

#include

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

函式功能·:

將共享記憶體段連線到程序位址空間

引數解釋:

引數一:共享記憶體標識碼

引數三:有兩個取值,可能為shm_rnd和shm_rdonly    

返回值:

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

說明:shmaddr為null,核心自動選擇乙個位址

shmaddr不為null且shm***無shm_rnd標記,則以shmaddr為連線位址。

shmaddr不為null且shm***設定了shm_rnd標記,則連線的位址會自動向下調整為shmlba的整數倍。公式:shmaddr - (shmaddr % shmlba)

shm***=shm_rdonly,表示連線操作用來唯讀共享記憶體

(3)shmdt函式

函式原型:

#include

#include

int shmdt(const void *shmaddr);

函式功能·:

將程序與當前共享記憶體脫離

引數解釋:

由shmat返回的指標

返回值:

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

說明:將程序與當前共享記憶體段分離與刪除此共享記憶體段是不同的

(4)shmctl函式

函式原型:

#include

#include

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

函式功能:

用於控制共享記憶體

函式引數解釋:

引數一:共享記憶體標識碼

引數二:將要採取的動作,一共有三個選擇·,ipc_stat,ipc_rmid,ipc_set

引數三:乙個結構體的例項

struct shmid_ds {

struct ipc_perm shm_perm;    /* ownership and permissions */

size_t          shm_segsz;   /* size of segment (bytes) */

time_t          shm_atime;   /* last attach time */

time_t          shm_dtime;   /* last detach time */

time_t          shm_ctime;   /* last change time */

pid_t           shm_cpid;    /* pid of creator */

pid_t           shm_lpid;    /* pid of last shmat(2)/shmdt(2) */

shmatt_t        shm_nattch;  /* no. of current attaches */

...返回值:

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

例項**:

執行結果:

說明:**的實質是將兩個程序都連線到共享記憶體上,用client向共享記憶體中寫資料,用server往外讀資料,兩個程序看到一片共同的記憶體。

和訊息佇列一樣,共享記憶體也是隨核心的,必須用指令來刪除,使用  ipcs -m 列出所有的共享記憶體

使用ipcrm -m 刪除共享記憶體

Linux linux程序間通訊

程序間通訊是指在不同程序之間傳播或交換資訊 程序間通訊可分為以下幾類 管道 匿名管道和命名管道 system ipc 訊息佇列 用於資料傳輸 共享記憶體 用於資料共享 訊號量 用於事件通知 posix ipc 訊息佇列 共享記憶體 互斥量條件變數 訊號量讀寫鎖 主要介紹常用的如管道 訊息佇列 訊號量...

Linux Linux程序間通訊之訊息佇列

1 訊息佇列概念引入 訊息佇列提供了乙個從乙個程序向另外乙個程序傳送一塊資料的方法每個資料塊都被認為是有乙個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的 msgmax 每個訊息佇列的總的位元組數是有上限的 msgmnb 系統上訊息佇列的總...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...