linux應用基礎知識點14 IPC之共享記憶體

2021-10-05 04:08:28 字數 1966 閱讀 9020

用共享記憶體實現程序間通訊,可以省卻檔案向程序的讀取、修改、寫回一系列繁瑣的操作。而是直接可對該記憶體空間進行修改。

相關函式

posix和system v均提供了共享記憶體的實現函式,linux將兩種實現方式均吸納為己所用。

posix的函式:shm_open mmap munmap ftruncate

systemv的函式:shmget shmat shmdt shmctl

posix共享記憶體步驟:

1 . 建立或開啟共享記憶體區

int shm_open(const char *name, int o_flag, mode_t mode);
name指定建立或開啟的共享記憶體的名稱;

o_flag為開啟方式;

mode在flag為o_creat才有效。

2. 設定共享記憶體的大小

int ftruncate(int fd, off_t length);
fd為共享記憶體的描述符;

length指定調整的大小

3. 對映共享記憶體區

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
addr指向對映儲存區的起始位址,通常設為null讓系統自動分配;

length為對映的位元組數;

prot為對對映儲存區的許可權,該許可權不能超過檔案的open模式訪問許可權;

flags指定對映是否為共享的,即一旦修改其它程序是否能看到變化;

offset為要對映位元組在檔案中的起始偏移量。

取消對映共享記憶體

int munmap(void *addr, size_t length);
addr為mmap()返回的位址;

length為對映的位元組數。

刪除共享記憶體

int shm_unlink(const char *name);
systemv共享記憶體步驟:

1 . 建立或開啟共享記憶體區

int shmget(key_t key,size_t size, int shm***);
引數key:通過唯一的key值,使本函式返回乙個與key相關的共享記憶體識別符號(非負);

引數size:位元組為單位的容量大小

引數shm***:shm***為許可權標誌,指示該記憶體的使用許可權,如0644代表建立者可讀寫、其他使用者只能讀取。如果該共享記憶體區不存在,需要建立的話,可以加上ipc_creat,如0644|ipc_creat

2. 連線共享記憶體區(attach)

建立完共享記憶體後,需要連線到當前程序的位址空間才能對齊訪問。

void *shmat(int shmid, const void *shm_addr, int shm***);
引數shmid:共享記憶體識別符號(通過shmget()獲得)

引數shm_addr:指定要連線到當前程序的位址位置,一般用null自動分配。

引數shm***:標誌位,一般為0.

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

3 . 解除共享記憶體連線(detach)

int shmdt(const void *shmaddr);
4 . 控制共享記憶體

int shmctl(int shmid, int command, struct shmid_ds *buf);
引數shmid:共享記憶體識別符號

引數command:要採取的操作

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

linux基礎知識點

1.在vmware安裝linux系統和快照功能使用。注意 2.系統目錄介紹 1 表示根目錄 2 表示 root 3 etc 存放系統配置目錄 4 home 除了root以為所有使用者預設在home下新建乙個以使用者名為資料夾名稱的資料夾。5 usr 所有使用者安裝的軟體都放入這個資料夾中。知識點擴充...

linux基礎知識點複習

暫時先放一些linux的一些操作的東西 1 vm 虛擬機器 2 redhad 作業系統 3 xshell 終端軟體 4 notepad 編碼 5 課件 思維導圖 mindmanage word ppt xshell nat模式連線 ssh ip位址 注意 1 必須要有網 2 虛擬機器的網絡卡要開啟 ...

linux基礎知識點一

命令的語法 命令 選項 引數 引數 命令操作的物件 選項 命令在操作物件是採用不容的選項即使用不同的方式。基本命令 ls 列出目錄中的內容 list 選項 l 以長格式的方式列出 ll ls l a 列出全部內容,包含隱藏檔案和隱藏目錄 h 以人類易讀的方式顯示 pwd 列印當前工作目錄 cd 更改...