博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Linux编程】存储映射I/O
阅读量:5274 次
发布时间:2019-06-14

本文共 1840 字,大约阅读时间需要 6 分钟。

存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射,对缓冲区的读、写操作就是对文件的读、写操作,从而能够不再使用read、write系统调用。
将文件映射到存储区的函数由mmap完毕,函数原型例如以下:
#include 
/* 成功返回映射区起始地址,出错返回MAP_FAILED */void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);
參数说明:
  • addr:指定映射存储区的起始地址,通常为0表示由系统选择起始地址。
  • len:须要映射的字节数。
  • prot:对映射存储区的保护要求,不能超过open文件时的权限。
    • PROT_READ:映射区可读
    • PROT_WRITE:映射区可写
    • PROT_EXEC:映射区可运行
    • PROT_NONE:映射区不可訪问
  • flag:影响映射存储区的属性。
    • MAP_FIXED:返回值必须等于addr,不利于移植。不鼓舞使用。
    • MAP_SHARED:表示存储操作相当于对该文件的write。
    • MAP_PRIVATE:对映射区的存储操作导致创建该映射文件的一个私有副本。
  • filedes:指定要被映射的文件描写叙述符,映射之前须要先打开该文件。
  • off:要映射字节在文件里的起始偏移量。通常为0。
存储映射例如以下所看到的:
測试代码:
#include 
#include
#include
#include
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) int main(int argc, char *argv[]){ int fdin, fdout; void *src, *dst; struct stat statbuf; if (argc != 3) { printf("usage: %s
\n", argv[0]); return -1; } fdin = open(argv[1], O_RDONLY); fdout = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, FILE_MODE); fstat(fdin, &statbuf); lseek(fdout, statbuf.st_size - 1, SEEK_SET); write(fdout, " ", 1); /* lseek偏移量大于文件长度时。写操作将加长文件 */ src = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, fdin, 0); dst = mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fdout, 0); memcpy(dst, src, statbuf.st_size); /* 数据复制 */ munmap(src, statbuf.st_size); munmap(dst, statbuf.st_size); return 0;}
此函数实现了文件内容之间的拷贝。

lseek + write的组合操作使得目标文件的大小添加到和源文件大小同样。由于当lseek设置的文件偏移量大于文件当前长度时。下一个写操作将会使文件增大。假设没有对目标文件扩大。那么进程会接收到SIGBUS信号。表示存储区中有地址无法映射到文件里。

mmap实际上是将包括文件内容的内核缓冲区映射到应用程序地址空间,然后用memcpy直接进行数据的拷贝。其优势在于避免了类似read、write系统调用,在内核空间和用户空间之间的数据传递。
參考:
《unix环境高级编程》 P390-P395.

转载于:https://www.cnblogs.com/yxwkf/p/5093182.html

你可能感兴趣的文章
IIS中如何应用程序启用https协议
查看>>
ios
查看>>
APPIUM API整理(python)---操作类
查看>>
可能是把Java内存区域讲的最清楚的一篇文章
查看>>
Oracle函数使用
查看>>
hive基本操作与应用
查看>>
common-fileupload上传文件
查看>>
第 6 天 python的类
查看>>
EularProject 32: 数字1-9排列构成乘法等式
查看>>
1079. Total Sales of Supply Chain (25)
查看>>
ThinkPHP 文件上传处理
查看>>
【转】移动前端手机输入法自带emoji表情字符处理
查看>>
5分钟了解swagger
查看>>
美赛论文写作--写作规范
查看>>
获取当前用户
查看>>
Mysql BLOB、BLOB与TEXT区别及性能影响、将BLOB类型转换成VARCHAR类型
查看>>
C运行时库
查看>>
使用sed进行文字替换
查看>>
20155228 2016-2017-2《Java程序设计》课程总结
查看>>
日志框架实现实时改动,实时生效,详细框架思路(5)
查看>>