mmap的man原型解释:
#include <sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *start, size_t length);
简单就是将文件内容映射到内存中,然后直接从内存中进行读写。
start 指向对应的内存起始地址,设置为NULL代表由系统自行分配处理
length 映射多大区域到内存
prot 映射区域的保护方式,比如:
PROT_EXEC 可执行
PROT_READ 可读取
PROT_WRITE 可写入
PROT_NONE 不能存取
flags 映射区域的各种特性,比如:
MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正
MAP_SHARED 对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。
MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。
MAP_ANONYMOUS 建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。
MAP_DENYWRITE 只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。
MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。
fd 映射区的文件描述符
offset 偏移
测试代码:
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main(int argc, char const *argv[])
{
int fd = -1;
void *start = NULL;
struct stat sb = {'\0'};
fd = open("/etc/passwd", O_RDONLY); /* open "/etc/passwd" file for map. */
fstat(fd,&sb); /* get file size. */
start = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if(start == MAP_FAILED) /* map failed. */
{
return;
}
printf("\033[43;31m%s\033[0m\r\n",start);
munmap(start, sb.st_size); /* release map memory. */
close(fd);
}