共享内存mmap
来源:互联网 发布:高淇java300集 知乎 编辑:程序博客网 时间:2024/06/06 17:59
mmap的是将文件指定的区域映射到内存缓冲区中,从缓冲区中读取数据就相当于从文件中读取相应数据,对缓冲区进行写操作相当于写入文件相应位置。
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);//将文件映射到内存中,addr和offset通常为0,length是映射的内存长度,prot是内存的权限(不能高于fd的打开权限),flags是内存属性 int munmap(void *addr, size_t length);//解除该映射一个实例,将文件映射到内存然后直接操作内存从而写入文件
#include<stdio.h>#include<string.h>#include<sys/mman.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdlib.h>int main(){ int fd=open("1.txt",O_RDWR|O_CREAT,S_IRWXU);//创建文件 lseek(fd,49,SEEK_SET);//由于刚创建的文件为空,需要先扩充文件内容,才能mmap映射至内存后操作内存,不然会报错 write(fd," ",1);//象征性的写一个字 void *buf=mmap(NULL,30,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//length参数不足一个内存页按照一个内存页计算(512B) memcpy(buf,"hello world\nso beautiful\n",strlen("hello world\nso beautiful\n"));//直接操作内核缓冲区,最后的结果写入文件 printf("%s",buf); //msync(buf,30,MS_SYNC);//等到写入文件后返回,这里未使用 //munmap(buf,20);//解除映射 exit(0);}文件内容:
hello world
so beautiful
在网络编程中,文件映射可以快速IO,因为这比read/write组合调用少了内核缓冲区到用户态缓冲区(read)和用户缓冲区到内核态(write)两次拷贝。
mmap还可以作为内存共享,这种方式通常不映射文件,将mmap函数参数的flags置为MAP_ANNON,fd置为-1,就可以实现内存共享(没有映射到文件),创建一个length大小的可读写的共享内存方式例如:
void* mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0)当有了共享内存后,多个亲缘进程间就可以通过内存指针进行通信。
0 0
- 共享内存(mmap)
- mmap共享内存
- mmap共享内存
- mmap共享内存
- linux 内存共享mmap
- LINUX共享内存mmap
- mmap共享内存
- mmap 共享 内存映射
- 共享内存mmap
- 共享内存mmap
- 共享内存mmap
- mmap共享内存
- linux共享内存mmap
- 共享内存 mmap
- 共享内存 与 mmap
- 进程通信--mmap内存共享
- 进程通信-共享内存-mmap()
- 共享内存mmap()和CreateFileMapping()
- apache commons Logging与Log4j结合的使用
- SLF4J与Log4j整合使用
- Python读写mongo时区问题
- 关于C++中sizeof()、数组长度和函数传参的一点心得
- ubuntu远程管理与OpenSSH Server的搭建
- 共享内存mmap
- 阿里实习招聘笔试总结2014-03-29
- 第七周 项目4 友元类
- Java基础1
- Android 大神Dianne Hackborn对大家讨论Android流畅性为什么不如iOS的回应(二)
- VIM 编译C、C++、Fortran脚本
- 关于cetnos6.4 的网络配置
- 十进制转十六进制
- 实验二 第一题 模拟分页式存储管理中硬件的地址转换和产生缺页中断