#include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> /* * mmap函数 * 用来将某个文件的内容映射到内存中,对该内存区域的存取既是对该文件内容的读写 * void *mmap(void *start, size_t length, int port, int flags, int fd, off_t offsize) * 参数start指向欲对应的内存地址的原始地址,通常设为NULL * 参数length代表文件中多大的部分对应到内存 * port映射区域的保护方式: * PORT_EXEC 映射区域可被执行 * PORT_READ 映射区域可被读取 * PORT_WRITE 映射区域可被写入 * PORT_NONE 映射区域不能存取 * MAP_FIXED,MAP_SHARED * flags映射区域的特性: * MAP_PRIVATE:映射区域的写入操作会产生一个映射文件 * MAP_ANONYMOUS:建立匿名映射时忽略参数fd,映射区域无法和其他进程共享 * MAP_DENYWRITE:只允许对映射区域的写入操作,其他对文件的直接写入操作会被拒绝 * MAP_LOCKED:将映射区域锁住 * fd为open返回的表述 * offsize为文件映射的偏移量,0代表从文件头开始 * * 映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1) * 在调用mmap时必须指定MAP_SHARED或MAP_PRIVATE */ /* * 功能:利用mmap读取/etc/passwd文件内容,把文件内容映射到内存中的区域,可 * 被读此区域中的内容,对映射区域的写入操作会产生一个映射文件。 */ int main(void) { int fd; void *start; struct stat sb; fd=open("/etc/passwd",O_RDONLY); fstat(fd, &sb); start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0); if(start == MAP_FAILED) { return 0; } printf(" %s ",start); munmap(start, sb.st_size);//解除映射 close(fd); }