Linux程序通訊 共享記憶體

2021-09-02 12:53:52 字數 2728 閱讀 7381

共享記憶體

共享記憶體是一種最為高效的程序間通訊方式,在程序間通訊時核心專門的留出一塊記憶體區。在這段記憶體區可以由訪問程序將其對映到自己的私有位址空間。因此程序就可以直接讀寫這一塊記憶體區,極大的提高了效率。

共享記憶體的步驟:

(1)建立共享記憶體;

(2)對映貢獻記憶體;

原理:

相關函式

shmget():建立一塊共享記憶體或者獲取一塊已經存在的共享記憶體;

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

key:共享記憶體鍵值,多個程序可以通過它訪問同乙個共享記憶體。其中有特殊值

ipc_private,用於建立當前程序的私有共享記憶體

size:共享記憶體區大小

shmflag: 同open()設定許可權鍵位,可用八進位制表示法

返回值:成功共享記憶體的識別符號 錯誤:-1 並設定erron

用shmget()建立共享記憶體時這段核心資料會被清空為0 並設定核心資料結構shmid_ds:

struct shmid_ds;
shmat()將核心中的記憶體對映到自己的私有位址裡面

#include#include#includevoid* shmat(int shm_id,const void * shmaddr,int shm***);

shmid:對映的共享記憶體區識別符號

的位址空間)最終效果受shm***影響

shm***:可選標誌

shm_rnd:

若shmaddr非null並shm_rnd未被設定,共享記憶體對映到指定shmaddr

若shmaddr非null並shm_rnd被設定,則關聯位址為[shmaddr-(shmaddr%shm_rnd)]

shm_rdonly:程序只可讀共享記憶體,若沒有該標誌則程序可直接對共享記憶體執行讀寫

shm_remap:若果shmaddr已經關聯了則重新關聯

shm_exec:指對共享記憶體的執行許可權

shmat() 成功時將修改核心資料結構shmid_ds:

shmdt()記憶體對映撤銷

#include#include#includeint shmdt(const void *shmaddr);

返回值:成功0 錯誤-1

shmctl()系統呼叫控制共享記憶體的某些屬性
#includeint shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmid:共享記憶體識別符號

cmd:引數指定要直行的命令

ipc_stat:得到共享記憶體的狀態,把共享記憶體的shmid_ds結構複製到buf中

ipc_set:改變共享記憶體的狀態,把buf所指的shmid_ds結構中的uid、gid、mode複製到共享

記憶體的shmid_ds結構內

ipc_rmid:刪除這片共享記憶體

ipc_info:獲取系統記憶體資源配置資訊,將結果儲存在buf結構體中。

shm_info:與ipc_info類似不過返回的是已經分配好了的共享記憶體資源資訊配置

shm_stat:與ipc_stat類似,不過此時shm_id引數不是用來表示共享記憶體識別符號,而是內

核中共享記憶體資訊陣列的索引

shm_lock:禁止共享記憶體被移動至交換區

shm_unlock:允許共享記憶體被移動至交換區

返回值:成功cmd引數 錯誤-1並設定errno

簡單實現

head.h

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err() printf("%s\n",strerror(errno));exit(0)

intcreate_shmid

(char

*file,

int size)

int shmid;if(

(shmid=

shmget

(key,size,ipc_creat|

0666))

==-1)

return shmid;

}void

destory_shmid

(int shmid)

return

;}

serv.c

#include

"head.h"

intmain()

}else

return1;

}

clien.c

#include

"head.h"

intmain()

}else

}

linux程序通訊 共享記憶體

共享記憶體是ipc機制中的第二個。他允許連個不相關的程序訪問同一塊邏輯記憶體,能夠有效地實現兩個程序間資料傳遞。int shmget key t key,sizr t size,int shm 建立共享記憶體 key為共享記憶體段的命名,size為以位元組為單位的記憶體容量,shm 包含9位元許可權...

Linux程序通訊 共享記憶體

對於linux來講,不同程序之間的記憶體是不能讀寫的,乙個程序只能讀寫自己所屬的記憶體。a程序是不能讀寫b程序記憶體的?如果程式確實想通過記憶體交換資料怎麼辦?linux提供共享記憶體機制。共享記憶體是由核心處於多個程序間交換資訊的目的而留出的一塊記憶體區 段 共享記憶體也需要設定相關許可權的。這段...

linux 程序 共享記憶體通訊

1.概述 該demo主要實現linux下程序之間的共享記憶體通訊,相關介面介紹可以參考 2.場景 半雙工 父程序簡單地通過共享記憶體將資料傳送給子程序 3.測試 程序程式設計demo 共享記憶體 ipc相關的命令 ipcs ipcrm 釋放ipc 檢視程序屬性 ulimit a include in...