Linux系统编程4:共享内存mmap

mmap可以把磁盘文件的一部分直接映射到内存,这样文件的位置就有对应的地址
对文件的读写可以直接用指针来做而不需要read write
shared 映射
private 映射

修改内存中的数据,磁盘当中跟着修改shared
否则private映射 ,内存当中修改不影响磁盘
在这里插入图片描述

man mmap 查看这个函数的使用
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
//addr 映射的内存地址 NULL:在传递的地址附近找一块空闲内存空间分配 NULL:0地址
//length:映射磁盘文件的长度
//prot: PROT_READ PRO_WRITE PROT_EXEC 页面是否有读写执行权限
//flags MAP_SHARED MAP_PRIVATE
//fd 文件描述符 映射的磁盘文件必须打开
//off_t offse 偏移量 从哪个位置开始偏移4096的整数倍(页面)
//void*返回值:返回申请内存的首地址 失败返回宏
//失败原因:内存不够 或者传入无效的文件描述符
//文件只有读权限 映射时分配写权限.....

int munmap(void* addr,size_t length)//没有munmap 内存泄露
打开文件描述符 没有关闭 也会导致内存泄露

//写进程
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/mman.h>

#define MAPLEN 0x1000
void sys_err(char* str,int exitno){
    perror(str);
    exit(exitno);
}
int main(int argc,char* argv[]){
    char*mm;
    int fd;
    int i;
    if(argc < 2){
        printf("%s filename\n",argv[0]);
        exit(1);
    }
    fd=open(argv[1],O_RDWR|O_CREAT,0777);//文件不存在 创建
    if(fd < 0)
        sys_err("Open error",1);

    lseek(fd,MAPLEN-1,SEEK_SET);//拓展一个文件
    if(lseek < 0 )
        sys_err("lseek",3);

    if(write(fd,"\0",1)<0)
        sys_err("write error",4);

    mm=mmap(NULL,MAPLEN-1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    if(mm == MAP_FAILED)
    	sys_err("mmap error",2);
    close(fd);

    while(1){
        sprintf(mm,"hello%d",i++);
        sleep(1);
    }
    munmap(mm,MAPLEN);
    return 0;
}
                             
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/mman.h>

#define MAPLEN 0x1000
void sys_err(char* str,int exitno){
    perror(str);
    exit(exitno);
}
int main(int argc,char* argv[]){
    char*mm;
    int fd;
    int i;
    if(argc < 2){
        printf("%s filename\n",argv[0]);
        exit(1);
    }
    fd=open(argv[1],O_RDWR);
    if(fd < 0)
        sys_err("Open error",1);

    mm=mmap(NULL,MAPLEN-1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    if(mm == MAP_FAILED)
        sys_err("mmap error",2);
    close(fd);

    while(1){
        printf("%s\n",mm);
        sleep(1);
    }
    munmap(mm,MAPLEN);
	return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值