用mmap()共享内存用python解析html接口: void *mmap( void *start, size_t length, int port, int flags, int fd, off_t offset) 正常返 回映射区的地址,出错返回-1。 start 为映射区域的首地址,一般赋 值NULL通过系统自动分配。 length 为区域大小。 fd 为映射文件的文件描述符。 offset 为映 射文件的偏移,也就是从文件的offset处开始映射。 port : 映射 区域的属性值,可取PORT_EXEC, PORT_READ, PORT_WRITE, PORT_NONE,四个值,分别 是区域内可执行、可读、可写和不可访问。 flags : 映射文件属 性值,可取 MAP_ANON, MAP_PRIVATE, MAP_SHARED,分别代表匿名映射,私有copy-on -write映射,和共享映射。 MAP_ANON映射只能实现父子进程的内存共 享,因为只有父子进程有才有相同的映射后的地址空间,不同进程的内存共享需要用 MAP_SHARED通过映射文件来实现。 MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。 MAP_PRIVATE多个进程对同一个文件的映射不是共享的,一个进程对映射的内存做了修改,另一个进程并不会看到这种变化,也不会真的写到文件中去。 值得一提的是,映射的初期并没有 真正分配内存,只有访问页面的时候,引发一个缺页异常,这时才真正分配内存。 示例a.c和b.c,先建立一个文件sharefile,内容是”My name is Foo!”。 ----a.c---- int main() ----b.c---- #include <stdio.h> 运行./a 程序输出: My name is Foo! 停止10s My name is Foo! 先运行./a, 然后切换另一个控制台运行./b,切换回发现a的输出变为: My name is Foo! 停止10s My name is Bar! 可见,a内 存中的内容被b修改了~最后的munmap函数会使得映射内存中的内容写回文件中,所以 文件中的内容也变成”My name is Bar!”。 参考资料: 1. 《Computer Systems - A Programmer's Perspective》 2.《Linux Programming by Example》 |
|