示例1:
1.首先建立一个文本文件,名字为tmp,内容为hello world
2.编写mmap.c
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> int main() { int fd, len; int *p; fd = open("tmp", O_RDWR); if (fd < 0) { perror("open"); exit(1); } len = lseek(fd, 0, SEEK_END); // 第一个参数代表内存起始地址,设为NULL代表让系统自动选定地址 p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { perror("mmap"); exit(1); } // 如果映射成功,修改p[0] p[0] = 0x30313233; close(fd); // 释放内存映射地址 munmap(p, len); return 0; }
3.运行,并查看tmp内容
od -tx1 -tc tmp
0000000 33 32 31 30 6f 20 77 6f 72 6c 64 0a
3 2 1 0 o w o r l d
0000014
磁盘文件tmp的内容已被修改.
示例2:利用mmap实现进程间通信
process_mmap_w.c
/* process_mmap_w.c */ #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #define MAPLEN 0X1000 struct STU { int id; char name[20]; char sex; }; void sys_error(char *str, int exitno) { perror(str); exit(exitno); } int main(int argc, char *argv[]) { struct STU *mm; int fd, i = 0; if(argc < 2) { printf("Need filename! "); exit(1); } fd = open(argv[1], O_RDWR | O_CREAT, 0777); if (fd < 0) sys_error("open", 1); if (lseek(fd, MAPLEN-1, SEEK_SET) < 0) sys_error("lseek", 3); if (write(fd, "