- mmap、munmap、msync
mmap是把一个文件或一个内存区对象映射到调用进程的地址空间,使用该函数的目的有三个:
(1)使用普通文件以提供内存映射I/O
(2)使用特殊文件以提供匿名内存映射
(3)使用shm_open以提供无亲缘关系进程间的Posix共享内存区
#include<sys/mman.h>
void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset);
flags:MAP_SHARED或MAP_PRIVATE。
MAP_PRIVATE:那么调用进程对被映射数据的修改只对该进程可见,而不改变底层支撑对象(或是一个文件对象、或是一个共享内存区对象)。
MAP_SHARED:那么调用进程对被映射数据的修改对于共享该对象的所有进程都可见,而且确实改变了其底层支撑对象。
父子进程之间共享内存去的方法之一是,父进程在调用fork之前先指定MAP_SHARED标志调用mmap。这样父进程的映射关系就存留到子进程当中。而且父进程所作的修改子进程能看到。
举例:父子进程通过共享内存区,給内存映射文件当中的计数器持续加1
注意:上面的信号量是有名信号量,而有名信号量是在内核当中维护的。
再用匿名信号量实现上述过程:
- 前面主要讨论共享内存以及mmap,并给mmap实现父子进程共享内存的例子。现在主要把共享内存区的概念扩展到无亲缘关系进程间共享的内存区
Posix.1提供俩种在无亲缘关系进程间的共享内存区的方法(1)内存映射文件:即上面讲到的使用mmap映射文件的方法。上面主要使用这种方法实现父子进程之间的共享内存区,它也可以用于无亲缘关系的进程之间。(2)共享内存区对象:由shm_open打开一个Posix.1 IPC名字,所返回的描述符由mmap函数映射到当前进程的地址空间。
注:无亲缘关系的进程同步使用信号量的话要使用有名信号量。