File System

内存映射文件

除了 read()write() 来读写文件外,还可以利用 mmap() 将文件字节序列映射到进程虚拟地址空间,随后进程可以使用内存访问指令来直接访问文件内容。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fprintf(stderr, "usage: ./a.out [offset]\n");
    return 1;
  }

  // open the file
  int fd = open("mmapdemo.c", O_RDWR); 
  if (fd == -1) {
    perror("open failed");
    return 1;
  }

  // get file attributes
  struct stat sbuf;
  if (stat("mmapdemo.c", &sbuf) == -1) {
    perror("stat failed");
    return 1;
  }

  // get offset
  int offset = atoi(argv[1]);
  if (offset < 0 || offset > sbuf.st_size - 1) {
    fprintf(stderr, "offset must be in the range 0-%ld\n", sbuf.st_size - 1);
    return 1;
  }

  // memory map
  char *data = mmap(NULL, sbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  if (data == (void*)(-1)) {
    perror("mmap failed");
    return 1;
  }
  
  printf("byte at offset %d is '%c'\n", offset, data[offset]);
  data[offset] = '!';

  munmap(data, sbuf.st_size);
  return 0;
}