北京期刊网站建设,基于微信小程序的毕业设计题目,绍兴柯桥建设局网站,邹平做网站目录 内存映射内存映射相关系统调用内存映射的注意事项如果对mmap的返回值(ptr)做操作#xff0c;释放内存#xff08;munmap#xff09;是否能够成功#xff1f;如果open时O_RDONLY#xff0c;mmap时prot参数指定PROT_READ | PROT_WRITE会怎样#xff1f;如果文件偏移量… 目录 内存映射内存映射相关系统调用内存映射的注意事项如果对mmap的返回值(ptr)做操作释放内存munmap是否能够成功如果open时O_RDONLYmmap时prot参数指定PROT_READ | PROT_WRITE会怎样如果文件偏移量为1000会怎样mmap什么情况下会调用失败open的时候O_CREAT一个新文件来创建映射区吗mmap后关闭文件描述符对mmap映射有没有影响对ptr越界操作会怎样 内存映射完成文件复制匿名映射 内存映射
将磁盘文件的数据映射到内存中用户通过修改内存就能修改磁盘文件
内存映射相关系统调用
内存映射 void *mmap 释放内存 int munmap
#includestdio.h
#includesys/mman.h
#includefcntl.h
#include sys/types.h
#include sys/stat.h
#include string.h
#include stdlib.h
#include unistd.h
#include string.h
#include wait.hint main(){//1.打开一个文件int fdopen(test.txt,O_RDWR);int sizelseek(fd,0,SEEK_END);//获取文件大小//2.创建内存映射区void *ptrmmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);if(ptrMAP_FAILED){perror(mmap);exit(0);}//3.创建子进程pid_t pidfork();if(pid0){wait(NULL);//父进程char buf[64];strcpy(buf,(char *)ptr);printf(read data: %s\n,buf);}else if(pid0){//子进程strcpy((char *)ptr,nihao a,son!!!);}//关闭内存映射区munmap(ptr,size);return 0;
}文件中的内容也被修改了 内存映射的注意事项
如果对mmap的返回值(ptr)做操作释放内存munmap是否能够成功
不能可以做操作但是不能正确释放不是从首地址开始释放了需要先保存地址
如果open时O_RDONLYmmap时prot参数指定PROT_READ | PROT_WRITE会怎样
会返回一个宏map_failed相当于-1 open函数中的权限建议和prot参数的权限保持一致
如果文件偏移量为1000会怎样
偏移量必须是4k的整数倍会返回map_failed
mmap什么情况下会调用失败
length0 权限不一致
open的时候O_CREAT一个新文件来创建映射区吗
可以的但是创建的文件的大小如果为0的话肯定不行 可以对新的文件进行拓展lseek来拓展或者truncate
mmap后关闭文件描述符对mmap映射有没有影响
映射区还存在创建映射区的fd被关闭没有任何影响
对ptr越界操作会怎样
越界操作操作的是非法的内存会产生段错误
内存映射完成文件复制
//使用内存映射实现文件拷贝的功能
#includestdio.h
#includesys/mman.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
#includeunistd.h
#includestdlib.h
#includestring.hint main(){//1.对原始的文件进行内存映射int fdopen(english.txt,O_RDWR);if(fd-1){perror(open);exit(0);}//获取原始文件的大小int lenlseek(fd,0,SEEK_END);//2.创建一个新文件拓展该文件int fd1open(cpy.txt,O_RDWR | O_CREAT,0664);if(fd-1){perror(open);exit(0);}//对新创建的文件进行拓展truncate(cpy.txt,len);write(fd1,,1);//3.分别做内存映射void * ptr mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);void * ptr1mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED,fd1,0);if(ptrMAP_FAILED){perror(mmap);exit(0);}if(ptr1MAP_FAILED){perror(mmap);exit(0);}//内存拷贝memcpy(ptr1,ptr,len);//释放资源先打开先释放munmap(ptr1,len);munmap(ptr,len);close(fd1);close(fd);return 0;
}匿名映射
不需要文件实体进行内存映射 之前的都是文件映射通过文件共享文件
#includestdio.h
#includesys/mman.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
#includeunistd.h
#includestdlib.h
#includestring.h
#includewait.hint main(){//1.创建匿名内存映射区int len4096;void * ptrmmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0);if(ptrMAP_FAILED){perror(mmap);exit(0);}//父子进程通信pid_t pidfork();if(pid0){//父进程strcpy((char *)ptr,hello,world);wait(NULL);}else if(pid0){//子进程sleep(1);printf(%s\n,(char *)ptr);}//释放内存映射区int retmunmap(ptr,len);if(ret-1){perror(munmap);exit(0);}return 0;
}实现父子进程通信