当前位置: 首页 > news >正文

如何做app网站科技部政服务服平台

如何做app网站,科技部政服务服平台,网站空间购买官方,如何建设营销型的网站目录 内存映射内存映射相关系统调用内存映射的注意事项如果对mmap的返回值(ptr)做操作,释放内存(munmap)是否能够成功?如果open时O_RDONLY,mmap时prot参数指定PROT_READ | PROT_WRITE会怎样?如果文件偏移量…

目录

  • 内存映射
  • 内存映射相关系统调用
  • 内存映射的注意事项
    • 如果对mmap的返回值(ptr)做++操作,释放内存(munmap)是否能够成功?
    • 如果open时O_RDONLY,mmap时prot参数指定PROT_READ | PROT_WRITE会怎样?
    • 如果文件偏移量为1000会怎样?
    • mmap什么情况下会调用失败?
    • open的时候O_CREAT一个新文件来创建映射区吗?
    • mmap后关闭文件描述符,对mmap映射有没有影响?
    • 对ptr越界操作会怎样?
  • 内存映射完成文件复制
  • 匿名映射

内存映射

将磁盘文件的数据映射到内存中,用户通过修改内存就能修改磁盘文件

内存映射相关系统调用

内存映射
void *mmap
释放内存
int munmap

#include<stdio.h>
#include<sys/mman.h>
#include<fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>int main(){//1.打开一个文件int fd=open("test.txt",O_RDWR);int size=lseek(fd,0,SEEK_END);//获取文件大小//2.创建内存映射区void *ptr=mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);if(ptr==MAP_FAILED){perror("mmap");exit(0);}//3.创建子进程pid_t pid=fork();if(pid>0){wait(NULL);//父进程char buf[64];strcpy(buf,(char *)ptr);printf("read data: %s\n",buf);}else if(pid==0){//子进程strcpy((char *)ptr,"nihao a,son!!!");}//关闭内存映射区munmap(ptr,size);return 0;
}

文件中的内容也被修改了
在这里插入图片描述

在这里插入图片描述

内存映射的注意事项

如果对mmap的返回值(ptr)做++操作,释放内存(munmap)是否能够成功?

不能,可以做++操作,但是不能正确释放,不是从首地址开始释放了,需要先保存地址

如果open时O_RDONLY,mmap时prot参数指定PROT_READ | PROT_WRITE会怎样?

会返回一个宏,map_failed,相当于-1
open函数中的权限建议和prot参数的权限保持一致

如果文件偏移量为1000会怎样?

偏移量必须是4k的整数倍,会返回map_failed

mmap什么情况下会调用失败?

length=0
权限不一致

open的时候O_CREAT一个新文件来创建映射区吗?

可以的,但是创建的文件的大小如果为0的话,肯定不行
可以对新的文件进行拓展,lseek来拓展,或者truncate

mmap后关闭文件描述符,对mmap映射有没有影响?

映射区还存在,创建映射区的fd被关闭,没有任何影响

对ptr越界操作会怎样?

越界操作操作的是非法的内存,会产生段错误

内存映射完成文件复制

//使用内存映射实现文件拷贝的功能
#include<stdio.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>int main(){//1.对原始的文件进行内存映射int fd=open("english.txt",O_RDWR);if(fd==-1){perror("open");exit(0);}//获取原始文件的大小int len=lseek(fd,0,SEEK_END);//2.创建一个新文件(拓展该文件)int fd1=open("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 * ptr1=mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED,fd1,0);if(ptr==MAP_FAILED){perror("mmap");exit(0);}if(ptr1==MAP_FAILED){perror("mmap");exit(0);}//内存拷贝memcpy(ptr1,ptr,len);//释放资源,先打开先释放munmap(ptr1,len);munmap(ptr,len);close(fd1);close(fd);return 0;
}

在这里插入图片描述

匿名映射

不需要文件实体进行内存映射
之前的都是文件映射,通过文件,共享文件

#include<stdio.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<wait.h>int main(){//1.创建匿名内存映射区int len=4096;void * ptr=mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0);if(ptr==MAP_FAILED){perror("mmap");exit(0);}//父子进程通信pid_t pid=fork();if(pid>0){//父进程strcpy((char *)ptr,"hello,world");wait(NULL);}else if(pid==0){//子进程sleep(1);printf("%s\n",(char *)ptr);}//释放内存映射区int ret=munmap(ptr,len);if(ret==-1){perror("munmap");exit(0);}return 0;
}

实现父子进程通信
在这里插入图片描述

http://www.yayakq.cn/news/878866/

相关文章:

  • 杭州网站开发制作公司大网站建设规范
  • 码上游二维码制作seo广告投放是什么意思
  • 重庆网站建设帝玖科技襄城县城乡建设管理局网站
  • 郑州市二七区建设局网站天猫入驻条件及费用2023
  • 建设门户网站需要多少钱小程序平台取名
  • 重庆公司网站制作公司网站域名哪看
  • 深圳网站建设公司网络服务课程网站建设的设计报告
  • 无锡网站设计厂家一般通过486
  • 营销网站的建设流程百度seo服务方案
  • 网站建设哈尔滨网站设计3制作壁纸的软件
  • 把网站做成app的软件下载南昌建站系统外包
  • 深圳服务网站入口网站赚钱系统
  • 河南省建设安全监督总站网站郴州市做网站
  • 毕业设计难度适中的网站开发项目题目江苏省建设集团有限公司
  • 解析到网站怎样做wordpress single.php
  • 网站从设计到制作家装设计网站怎么做
  • 中国建设银行手机银行网站装修大全
  • 不备案怎么做淘宝客网站做网站硬件
  • 网站建设管理工作小结网页微信授权登录
  • 简述网站设计基本流程那些使用vue做的网站
  • 海曙区建设局网站龙元建设网站
  • 校园网站建设方案策划书电商网站开发流程代码
  • 郴州网站建设哪家公司好t型布局网站的优缺点
  • 浙江广厦建设职业技术学院招生网站沈阳网页设计师
  • 网站有哪些类型青岛网站建设大全
  • 汕头网站建设方案书百度不收录什么网站
  • 企业网站怎么做连接淘客返利怎么做网站
  • 网站首页文件名通常是邯郸做移动网站价格表
  • 优化网站内容wordpress oa主题
  • 企业网站最重要的访问对象是0基础做网站用什么语言