存储映射IO-mmap()和munmap()

 -------根据网上视频整理

1、mmap():

所谓的存储映射IO是指将某一块内存或文件存储内容映射到当前进程中来。

其实,malloc不也是这种作用嘛。。。

效果:进程中访问一段char* 类型就像访问那段内存一样。

作用:做共享内存

#include <sys/mman.h>

void *mmap(void*addr,size_t length,int prot,int flags,int fd,off_t offset);

参数:

1)addr:映射到进程空间的起始位置

可以置为NULL,意为由mmap为我们找一块可用的地址空间。

2)length: 指要将多长的内容映射进来。内存大小。

3)prot:完成了内存映射,当前的内存是什么样的属性。也就是要对当前映射过来的内存做什么操作。

4)flags: 位图 ,对映射空间的特殊要求

必选项:以下二选一

MAP_SHARED :对内存空间所做的修改,别人都能看到

MAP_PRIVATE  :对内存的修改,只有自己能看到

非必选项:有好多

比如:

MAP_ANONYMOUS    :匿名映射,作用相当于 malloc

此时fd,可以置为-1. 

5)fd,文件描述符,即如果要对文件进行映射的话,需要先将文件打开。

6)offset:偏移量,fd中内容偏移量。一般置为0,因为我们一般从文件的其实位置开始。

故:mmap函数的意思:将fd中从偏移量offset开始的length长度字节的内存空间映射到addr这块地址中来,权限是prot,特殊要求是flags.

返回值:

成功:内存空间映射的起始位置。

失败:返回MAP_FAILED      即( (void*) -1),有宏的我们要使用宏,而不是宏值。设置errno.

 

2、munmap()

对映射过来的空间解除映射

int  munmap(void *addr,size_t length);

 

如果mmap时,flags使用了MAP_ANONYMOUS 表示,此时的munmap其实就是free()函数。

返回值:

成功返回0;

失败返回-1,设置errno(可能是 EINVAL).

3、示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char*arg[])
{
    int fd;
    struct stat statres;
    char *str;
    int i;
    int count = 0;
    if(argc<2)
    {
        fprintf(stderr,"argc error...\n");
        exit(1);
    }
    
   fd = open(argv[1],0_RDONLY);
   if(fd<0)
    {
        perror("open()");
        exit(1);
    }
    if(fstat(fd,&statres)<0)
    {
        perror("fstat");
        exit(1);
    }




   str =  mmap(NULL,statres.st_size,PROT_READ,MAP_SHARED,fd,0);
    if(str == MAP_FAILED)
    {
        perror("mmap()");
        exit(1);
    }
    close(fd);//可以在此处就关闭文件描述符,因为已经映射过来了,而且是只读。
    for(i = 0;i<ststres.st_size;i++)
    {
        if(str[i]=='a')
            count++:
    }
    printf("%d\n",count);
    munmap(str,statres.st_size);
    
    exit(0);
}

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fwrite是C语言中的一个函数,用于将数据写入文件。它的函数原型为: ```c size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); ``` 其中,ptr是指向要写入数据的指针,size是每个数据块的大小,count是要写入的数据块的数量,stream是指向文件的指针。fwrite函数的返回值是实际写入的数据块数量。 内存映射是一种将文件映射到内存中的技术,可以使得文件的读写操作变得更加高效。在Windows平台上,可以使用CreateFileMapping函数创建一个文件映射对象,然后使用MapViewOfFile函数将文件映射到内存中。这样,就可以直接在内存中读写文件,而不必每次都进行磁盘IO操作。内存映射的优点是可以提高文件读写的速度,缺点是可能会占用大量的内存空间。 以下是一个使用fwrite函数将数据写入文件的例子: ```c #include <stdio.h> int main() { FILE *fp; int data[] = {1, 2, 3, 4, 5}; int size = sizeof(int); int count = sizeof(data) / size; fp = fopen("data.bin", "wb"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } fwrite(data, size, count, fp); fclose(fp); return 0; } ``` 以下是一个使用内存映射将文件读入内存并进行操作的例子: ```c #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { int fd; struct stat sb; char *addr; fd = open("data.bin", O_RDONLY); if (fd == -1) { printf("Failed to open file.\n"); return 1; } if (fstat(fd, &sb) == -1) { printf("Failed to get file size.\n"); return 1; } addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (addr == MAP_FAILED) { printf("Failed to map file.\n"); return 1; } int *data = (int *)addr; int count = sb.st_size / sizeof(int); for (int i = 0; i < count; i++) { printf("%d ", data[i]); } printf("\n"); munmap(addr, sb.st_size); close(fd); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值