乱读天书, 不求甚解
周祎骏的个人云笔记
Toggle navigation
乱读天书, 不求甚解
主页
Linux:系统配置
Linux:用户管理
Linux:优化排错
Linux:进程调度
Linux:文件系统
Linux:网络
Linux:系统服务
Linux:安全
Linux:内核
容器:Docker
容器:containerd
容器编排:Kubernetes
IAC:Terraform
大数据:Hadoop
大数据:Zookeeper
大数据:Hbase
消息队列:rsyslog
消息队列:kafka
数据库:MySQL
数据库:MongoDB
搜索引擎:Elasticsearch
时序数据库:OpenTSDB
网站服务:Nginx
编程:Bash
编程:Perl
编程:Python
编程:C
编程:JAVA
编程:Rust
版本控制:gitlab
知识管理:docusaurus
常用小工具
关于我
标签
C 2.16 Linux函数库mman.h
2018-06-17 08:23:04
67
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 安全方面 ``` PROT_EXEC //页内容可以被执行 PROT_READ //页内容可以被读取 PROT_WRITE //页可以被写入 PROT_NONE //页不可访问 ``` * flag 选项 ``` MAP_FIXED :必须使用指定的映射起始地址(默认系统只把这个参数当做建议),用这个参数对可移植性不利 MAP_SHARED :对映射区域的写入数据会同步到文件中(由内核决定什么时候同步) MAP_PRIVATE :创建映射文件的副本。之后对该映射区域的读写都是存访该副本。 ``` * fd 文件句柄 * offset 映射区的偏移量,通常是0 ``` #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <sys/mman.h> #include <sys/stat.h> main() { int fd = open("./file",O_RDWR); struct stat f_stat; fstat(fd,&f_stat); printf("File size:%d\n",f_stat.st_size); char *mmap_addr; mmap_addr = (char *) mmap(0,f_stat.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); printf("File data:%s",mmap_addr); *(mmap_addr) = 'x'; *(mmap_addr + 1) = 'x'; printf("File data:%s",mmap_addr); } ``` **int munmap(caddr_t addr,size_t len)**: 去除映射区,不会促使系统同步文件,成功返回0,失败返回-1 **int msync(const void *addr, size_t len, int flags)**: 强制同步文件 * flag ``` MS_ASYNC : 立刻返回 MS_SYNC : 同步好以后再返回 MS_INVALIDATE : 使得文件的其他映射失效,从而使得共享该文件的其他进程去重新获取最新值 ``` *** #作为父子进程的共享内存 * 利用/dev/zero文件,因为它是一个无限个0的文件,同时接收并忽略所有写向它的数据 ``` #include <fcntl.h> #include <stdio.h> #include <sys/mman.h> main() { int fd = open("/dev/zero",O_RDWR); char *mmap_addr; mmap_addr = (char *) mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); close(fd); int pid = fork(); if(pid == 0) { while(1==1) { (*mmap_addr)++; sleep(1); } } else { while(1==1) { printf("%d\n",*mmap_addr); sleep(1); } } } ```
上一篇:
C 2.15 Linux函数库time.h
下一篇:
Docker 0.0 概念介绍
文档导航