8
  • shm_open()
  • mmap()带有预定义的大length
  • fork()(几次)
  • ftruncate()随意

这样做的目的是确保由其产生的每个进程fork()在同一地址上都有一个共享段。然而,我不想让 RAM 一直忙,而是动态调整它的大小(大小跨越 0 - big length)。

这能行吗?有UB吗?

4

3 回答 3

9

不,没关系。您可以随时截断基础文件,但SIGBUS如果您访问超出文件范围的内存,您可能会收到。因此,您需要非常小心,不要触摸超出文件当前长度的内存(或捕​​获SIGBUS并处理它)。

来自man 2 mmap

使用映射区域可能会产生以下信号:

SIGBUS尝试访问与文件不对应的缓冲区部分(例如,超出文件末尾,包括另一个进程截断文件的情况)。

于 2012-10-29T17:05:54.697 回答
1

不要调整它的大小。

我不想让 RAM 一直忙

这就是内核将为您使用虚拟内存所做的事情。只要您不使用mlock()或,它将根据需要/适当分页MAP_LOCKED

于 2012-10-29T17:55:18.207 回答
1

创建任意大小的映射,除非您实际使用它,否则它不会“让 RAM 保持忙碌”。

如果您担心在使用完 RAM后会保持忙碌状态,请致电madvise(MADV_DONTNEED)- 如果您再次访问它们,这将清除页面并从零池中返回新页面。

于 2012-10-29T18:06:11.010 回答