【Linux编程】存储映射I/O
#include <sys/mman.h> /* 成功返回映射区起始地址,出错返回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 <stdio.h> #include <fcntl.h> #include <sys/mman.h> #include <string.h> #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 <fromfile> <tofile>\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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。