1、映射区大小设置为0是不被允许的。换言之,用以映射的文件必须是有实际大小的/
2、MAP_SHARED时,一般创建映射区的权限应小于等于打开文件的权限,映射区创建的过程隐含着对文件的一次读操作。MAP_PRIVATE则无所谓。
3、mmap最后一个参数必须是4K的整数倍。因为是mmu帮助映射的
4、映射区一旦创立成功,那么文件描述符就没有用了
5、gdb追踪段错误步骤很简单:
gdb XXX.o
直接run。
哪句报错就是那句。
mmap出错率非常高,一定要检查返回值,确保映射成功。
6.ftruncate/truncate
truncate相关命令
用法:truncate 选项... 文件...
将文件缩减或扩展至指定大小。
如果指定文件不存在则创建。
如果指定文件超出指定大小则超出的数据将丢失。
如果指定文件小于指定大小则用0 补足。
7.unlink函数:删除临时文件目录项,是指具有被释放条件,那么在所有占用此文件的进程结束之后才会被释放。
父子进程共享:打开的文件 mmap建立的映射区(但必须要使用MAP_SHARED)
匿名映射:通过使用我们发现,使用映射区来完成文件读写操作非常方便,父子进程间通信也比较容易。但缺陷是,每次创建映射区一定要依赖一个文件才能实现,通常为了建立映射区要open一个temp文件,创建好了再unlink、close,比较麻烦。可以直接使用匿名映射来代替。其实linux系统给我们提供了创建匿名映射的方法,无需依赖一个文件即可。同样需要借助标志位flags来指定。
MAP_ANONYMOUS(MAP_ANON)
int *p=mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
4随意举例,该位置带下,可随意设置。
但是这种是Linux独有的,所以如果在求他系统使用/dev/zero伪文件来操作
int fd=open("/dev/zero",O_RDWR);
P=mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);