在mmap()之后使用ftruncate()调整文件大小

时间:2017-12-28 07:26:42

标签: linux linux-kernel mmap

代码段在我的机器上运行正常(Linux / x86-64)

int main()
{
  char* addr;
  int rc;
  int fd;
  const size_t PAGE_SIZE = 4096; // assuming the page size is 4096

  char buf[PAGE_SIZE];
  memset(buf, 'x', sizeof(buf));

  // error checking is ignored, for demonstration purpose

  fd = open("abc", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR);

  ftruncate(fd, 0);

  write(fd, buf, 4090);

  // the file size is less than one page, but we allocate 2 page address space
  addr = mmap(NULL, PAGE_SIZE * 2, PROT_WRITE, MAP_SHARED, fd, 0);

  // it would crash if we read/write from addr[4096]

  // extend the size after mmap
  ftruncate(fd, PAGE_SIZE * 2);

  // now we can access(read/write) addr[4096]...addr[4096*2 -1]

  munmap(addr, PAGE_SIZE * 2);
  close(fd);

  exit(EXIT_SUCCESS);
}

但POSIX说:

  

如果映射文件的大小在映射文件上的某些其他操作调用mmap()之后发生更改,则引用映射区域的部分对应于文件的添加或删除部分的效果没有具体说明。

所以我想这不是一种可移植的方式。但它是否可以在Linux上运行?

0 个答案:

没有答案