示例1:
1.首先建立一个文本文件,名字为tmp,内容为hello world
2.编写mmap.c
#include#include #include #include #include #include #include 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 \n0000014磁盘文件tmp的内容已被修改.
示例2:利用mmap实现进程间通信
process_mmap_w.c
/* process_mmap_w.c */#include#include #include #include #include #include #include #define MAPLEN 0X1000struct 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! \n"); 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, "\0", 1) < 0) sys_error("write", 4); mm = mmap(NULL, MAPLEN, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (mm == MAP_FAILED) sys_error("mmap", 2); close(fd); while(1) { mm->id = i; sprintf(mm->name, "zhang-%d", i); if (i%2 == 0) mm->sex = 'm'; else mm->sex = 'w'; i++; sleep(1); } munmap(mm, MAPLEN); return 0;}
process_mmap_r.c
#include#include #include #include #include #include #include #define MAPLEN 0x1000struct STU { int id; char name[20]; char sex;};void sys_err(char *str, int exitno){ perror(str); exit(exitno);}int main(int argc, char *argv[]){ int fd; struct STU *mm; if (argc < 2) { printf("Need input filename\n"); exit(1); } fd = open(argv[1], O_RDWR); if (fd < 0) sys_err("open", 1); mm = mmap(NULL, MAPLEN, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (mm == MAP_FAILED) sys_err("mmap", 2); close(fd); unlink(argv[1]); while(1) { printf("%d\n", mm->id); printf("%s\n", mm->name); printf("%c\n", mm->sex); sleep(1); } munmap(mm, MAPLEN); return 0;}
运行两个进程:
10
zhang-10m11zhang-11w12zhang-12m13zhang-13w14zhang-14m