共享内存

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起源比較早了。

相关文章
相关标签/搜索