UNIX环境高级编程:存储映射I/O(mmap函数)
发布时间:2016-09-27 01:53:33 所属栏目:Unix 来源:站长网
导读:副标题#e# 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共
我们要展示的第一种情形的前提是:文件大小等于内存映射区大小,但这个大小不是页面大小的倍数。 #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/types.h> #include <unistd.h> #include <sys/mman.h> #define max(A,B) (((A)>(B))?(A):(B)) int main(int argc,char ** argv) { int fd,i; char *ptr; size_t filesize,mmapsize,pagesize; if(argc != 4) printf("usage:tes1 <pathname> <filesname> <mmapsize>n"); filesize = atoi(argv[2]); mmapsize = atoi(argv[3]); /*open file:create or truncate;set file size*/ fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0777); lseek(fd,filesize-1,SEEK_SET); write(fd," ",1); ptr = mmap(NULL,mmapsize,PROT_READ |PROT_WRITE,MAP_SHARED,fd,0); close(fd); pagesize = sysconf(_SC_PAGESIZE); printf("PAGESIZE = %ldn",(long)pagesize); for(i = 0;i < max(filesize,mmapsize); i += pagesize) { printf("ptr[%d] = %dn",i,ptr[i]); ptr[i] = 1; printf("ptr[%d] = %dn",i + pagesize - 1,ptr[i + pagesize - 1]); ptr[i + pagesize - 1] = 1; } printf("ptr[%d] = %dn",i,ptr[i]); exit(0); } 命令行参数 16-19 命令行参数有三个,分别指定即将创建并映射到内存的文件的路径名,该文件将被设置成的大小以及内存映射区得大小。 创建,打开并截断文件;设置文件大小 22-24 待打开的文件若不存在则创建之,若已存在则把它的大小截短成0.接着把该文件的大小设置成由命令行参数指定的大小,办法是把文件读写指针移动到这个大小减去1的字节位置,然后写1个字节。 内存映射文件 25-26 使用作为最后一个命令行参数指定的大小对该文件进行内存映射。其描述符随后被关闭。 输出页面大小 28-29 使用sysconf获取系统实现的页面大小并将其输出。 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |