OK6410A 开发板 (八) 96 linux-5.11 OK6410A文件的访问 open-mmap-close


用户空间用的mmap函数,是glibc 提供的
	声明通过 man mmap 查找

	#include <sys/mman.h>
	void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

mmap 其中的一个用途(共享文件映射/私有文件映射) 是 访问文件
  • demo
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <error.h>
#include <string.h>

int main(int argc, char * argv[])
{
    int fd, nread;
    struct stat sb;
    char *mapped;

    //打开文件
    if((fd = open(argv[1], O_RDWR|O_CREAT,S_IRWXU)) < 0){
        perror("open") ;
        return -1;
    }

    write(fd,"123456789ABC",strlen("123456789ABC"));

    //获取文件的属性
    if((fstat(fd, &sb)) == -1 ){
        perror("fstat") ;
        return -2;
    }

    if (sb.st_size == 0)
        sb.st_size == 0x1000;


    //将文件映射至进程的地址空间
    if((mapped = mmap(NULL,
                    sb.st_size,
                    PROT_READ|PROT_WRITE,
                    MAP_SHARED,
                    fd,
                    0)) ==(void*) -1){
        perror("mmap") ;
        return -3;
    }

    //修改N个字符,同步到磁盘文件
    mapped[0] = 'h';
    mapped[1] = 'e';
    mapped[2] = 'l';
    mapped[3] = 'l';
    mapped[4] = 'o';
    mapped[5] = ' ';
    mapped[6] = 'W';
    mapped[7] = 'o';
    mapped[8] = 'r';
    mapped[9] = 'l';
    mapped[10] = 'd';

    if((msync((void *)mapped, sb.st_size, MS_SYNC)) == -1){
        perror("msync") ;
        return -4;

        //释放存储映射区
        if((munmap((void *)mapped,sb.st_size)) == -1){
            perror("munmap");
            return -5;
        }
    }

    close(fd);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值