C 2.16 Linux函数库mman.h
2018-06-17 08:23:04    65    0    0
admin

mmap函数

将存储空间与内存中映射,修改内存

caddr_t mmap(caddr_t addr, size_t len,int prot,int flag, int fd,off_t offset): 成功返回隐社区起始地址,失败返回-1
* caddr_t 通常就是char *, 这个参数指定内存起始地址,设置成0代表让系统来选
* len 代表映射区多大
* prot 安全方面

  1. PROT_EXEC //页内容可以被执行
  2. PROT_READ //页内容可以被读取
  3. PROT_WRITE //页可以被写入
  4. PROT_NONE //页不可访问
  • flag 选项
  1. MAP_FIXED :必须使用指定的映射起始地址(默认系统只把这个参数当做建议),用这个参数对可移植性不利
  2. MAP_SHARED :对映射区域的写入数据会同步到文件中(由内核决定什么时候同步)
  3. MAP_PRIVATE :创建映射文件的副本。之后对该映射区域的读写都是存访该副本。
  • fd 文件句柄
  • offset 映射区的偏移量,通常是0
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <sys/mman.h>
  6. #include <sys/stat.h>
  7. main()
  8. {
  9. int fd = open("./file",O_RDWR);
  10. struct stat f_stat;
  11. fstat(fd,&f_stat);
  12. printf("File size:%d\n",f_stat.st_size);
  13. char *mmap_addr;
  14. mmap_addr = (char *) mmap(0,f_stat.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
  15. printf("File data:%s",mmap_addr);
  16. *(mmap_addr) = 'x';
  17. *(mmap_addr + 1) = 'x';
  18. printf("File data:%s",mmap_addr);
  19. }

int munmap(caddr_t addr,size_t len): 去除映射区,不会促使系统同步文件,成功返回0,失败返回-1
int msync(const void *addr, size_t len, int flags): 强制同步文件
* flag

  1. MS_ASYNC : 立刻返回
  2. MS_SYNC : 同步好以后再返回
  3. MS_INVALIDATE : 使得文件的其他映射失效,从而使得共享该文件的其他进程去重新获取最新值

作为父子进程的共享内存

  • 利用/dev/zero文件,因为它是一个无限个0的文件,同时接收并忽略所有写向它的数据
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <sys/mman.h>
  4. main()
  5. {
  6. int fd = open("/dev/zero",O_RDWR);
  7. char *mmap_addr;
  8. mmap_addr = (char *) mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
  9. close(fd);
  10. int pid = fork();
  11. if(pid == 0)
  12. {
  13. while(1==1)
  14. {
  15. (*mmap_addr)++;
  16. sleep(1);
  17. }
  18. } else {
  19. while(1==1)
  20. {
  21. printf("%d\n",*mmap_addr);
  22. sleep(1);
  23. }
  24. }
  25. }

上一篇: C 2.15 Linux函数库time.h

下一篇: Docker 0.0 概念介绍

文档导航