标签:关闭 man failed 内存 字节 及返回值 命令 影响 返回值
1. mmap
mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针而不需要read/write函数。
共享内存交换数据,不切换权级,速度快。
mmap缺点:1)耗内存,碎片。2)普通文件。
优点:1)map速度快。 2)可原子访问任一字节,不用担心offset。
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flag, int fd, off_t off);
int munmap(void *addr, size_t len);
addr:NULL,内核会自己在进程地址空间中选项合适的地址建立映射。
len:不超过文件长度,否则总线错误。
prot:PROT_READ,PROT_WRITE, PROT_NONE, PROT_EXEC
flag:MAP_SHARED, MAP_PRIVATE, MAP_ANON
MAP_SHARED映射区unmap时,修改会回写磁盘文件。
MAP_PRIVATE不回写磁盘文件。
MAP_ANON(匿名区)纯内存区,不依赖任何文件。
off:文件起始偏移。
mmap映射的内存空间位于heap和stack之间(用户空间)。
成功返回空间地址,失败返回MAP_FAILED(=>(void *)-1)
PROT_EXEC要求fd必须可读RDONLY,PROT_WRITE要求fd必须O_RDWR。
map回写磁盘时直接从用户空间拷贝数据到磁盘,节省回写时间。
常规拷贝时需要从用户空间拷贝数据到内核,然后内核回写磁盘。
匿名映射:
char *p = mmap(NULL, 100, PROT_WRITE|PROT_READ, MAP_SHARED, -1, 0);
fd = -1代表与文件无关。
应用mmap()时,mmap()调用完后可关闭fd。
fd关闭并不影响该文件已建立的映射,仍然可以对文件进行读写。
可用strace命令执行程序,跟踪程序执行过程中用到的所有系统调用的参数及返回值。
标签:关闭 man failed 内存 字节 及返回值 命令 影响 返回值
原文地址:http://www.cnblogs.com/embedded-linux/p/6130059.html