共享內存

from:unix高級環境編程
linux

unix/linux中共享內存是最高效的ipc方式。編程

有幾種使用方式:函數

1)mmap /dev/zero設備:unix

fd = open("/dev/zero", O_RDWR);進程

area = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);ip

close(fd);內存

增長MAP_SHARED可以使子進程共享,但不相關進程不能共享。get


2)匿名mmap:cmd

4.3+BSD開始提供,需要MAP_ANON參數,效果和/dev/zero映射同樣。class

mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)


3)shm*系列函數,不一樣於mmap,可以在不相關進程中共享內存。

int shmget(key_t key, int size, int flag);返回共享內存ID(失敗返回-1)。

shmctl函數對共享存儲段運行多種操做:

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

命令有:IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK

一旦建立一個共享內存段,進程間就可以調用shmat(at是attach的意思)將其鏈接到本身的地址空間中。

void* shmat(int shmid, void* addr, int flag);

addr爲0,則此段鏈接到內核選擇的第一個可用地址;非0,則鏈接到addr提供的地址,設置SHM_RND的標誌可以對地址作對齊操做。

通常選擇addr = 0。flag中還提供SHM_RDONLY,以僅僅讀方式鏈接。

對共享內存操做結束後,調用shmdt(dt是detach)進行detach。

int shmdt(void* addr);

建立共享內存的那個進程最後還要使用shmctl刪除共享內存段(IPC_RMID)。


從資料來看,mmap起源比較早了。

相關文章
相關標籤/搜索