内存映射函数提供了把文件内容映射到用户程序空间的方法。
#include
void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *start, size_t length); //取消映射
start: 指定映射地址,一般为NULL,表示由mmap自定地址,映射成功后该地址会返回。
length: 映射的文件内容长度。
prot: 指定内存块的保护状态(如下,可组合使用)
PROT_EXEC 区域可执行
PROT_READ 区域可读
PROT_WRITE 区域可写
flags: 映射对象的类型(MAP_PRIVATE 和MAP_SHARED必须指定一个)
MAP_FIXED 如start地址不能用于映射,则调用失败,不建议用
MAP_SHARED 与其它进程共享该映射
MAP_PRIVATE 创建一个私有的“写入时复制(copy on write)”的映射,对映射区域所作的任何修改都不会写回原文件
MAP_ANONYMOUS,MAP_ANON 建立匿名映射,此时忽略fd,不涉及文件由系统创建映射,区域初始化为0,一般用于某些系统扩展堆用,也可用于多任务将共享数据而不创建文件。
fd: 文件描述符,表示欲映射到内存的文件。
offset: 文件映射的偏移量,通常为0,表示从文件头开始映射。
返回:出错返回-1,成功返回映射地址。
- /*
- * mmap内存映射
- * 写入10个数据至文件映射至内在中进行排序保存数据至文件
- * Lzy 2011-6-12
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <sys/mman.h>
- int main(void)
- {
- int i, j, num, lenth;
- int *p;
- int fd; //定义文件描述符
-
-
- fd = open("test", O_RDWR | O_CREAT, 00766); //创建、打开文件,以读写方式
- if(fd < 0)
- {
- perror("open faile");
- exit(0);
- }
-
- for(i = 0; i < 10; i++)
- {
- printf("%d ",num = (rand() % 100)); //取一百以内的随机数
- write(fd, &num, sizeof(int)); //写入文件
- }
- printf("\n");
-
- lenth = lseek(fd, 0, SEEK_END); //娶文件长度
-
- p = mmap(NULL, lenth, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); //内存映射
- if((int)p == -1)
- {
- perror("mmap fail");
- exit(0);
- }
-
- for(i = 0; i < 9; i++) //排序
- {
- for(j = i+1; j < 10; j++)
- {
- if(p[i] > p[j])
- {
- num = p[i];
- p[i] = p[j];
- p[j] = num;
- }
- }
- }
-
- munmap(p, lenth); //取消映射
- lseek(fd, 0, SEEK_SET); //读写指针指向文件头
-
- for(i = 0; i < 10; i++)
- {
- read(fd, &num, sizeof(int)); //读文件
- printf("%d ",num);
- }
- printf("\n");
- return 0;
- }
锁定和解锁内存
内存锁定函数允许进程锁定它的一些或全部内存,要求它们不被交换出内存,以提供应用程序的性能,因为系统繁忙时这可避免频繁分页交换。
#include
int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
int mlockall(int flags);
int munlockall(void);
addr, len须在页边界上,addr指明将要锁定的内存页面,len确定锁定区域的大小(即一次调用锁定一个或多个页面),返回0表示成功锁定,munlock解锁锁定的内存页以便其能重新可进行交换。
mlockall锁定进程的整个存储空间(代码,数据,栈,共享库,共享内存,共享映射内存),参数flags可取MCL_CURRENT表示当前虚拟地址空间,MCL_FUTURE将来调入的虚拟内存空间也将被锁定。
munlockall全部解锁。
注:子进程不能继承父进程的锁定特性。
- /*
- * 锁定和解锁内存
- * Lzy 2011-6-12
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/mman.h>
- char str[4096];
- int main(void)
- {
- int ret;
-
- ret = mlock(str,1024); //锁定内存
- printf("mlock ret = %d\n",ret); //返回0表示成功
-
- ret = munlock(str, 1024); //解锁内存
- printf("munlock ret = %d\n",ret); //返回0表示成功
-
- return 0;
- }
阅读(1562) | 评论(0) | 转发(3) |