shm_open()
mmap()
预定义的大length
fork()
(好几次)ftruncate()
随意这一点是为了确保fork()
生成的每个进程在同一地址都有一个共享段。然而,我不想让RAM一直保持忙碌,而是动态调整它的大小(大小为0 - 大length
)。
这可以吗?有UB吗?
答案 0 :(得分:8)
不,那没关系。您可以随时截断基础文件,但如果访问超出文件边界的内存,则可能会收到SIGBUS
。因此,您需要非常小心,不要触及超出文件当前长度的内存(或捕获SIGBUS
并处理它)。
来自man 2 mmap
:
使用映射区域可能会产生以下信号:
SIGBUS
尝试访问与之对应的缓冲区的一部分 文件(例如,超出文件末尾,包括案例 其他进程截断文件的位置。)
答案 1 :(得分:1)
不要调整它的大小。
我不想让RAM一直保持忙碌
这就是内核为虚拟内存做的事情。只要您不使用mlock()
或MAP_LOCKED
,就会根据需要进行分页。
答案 2 :(得分:1)
根据需要创建大小的映射,除非您实际使用它,否则不会“保持RAM忙”。
如果你担心在完成后使用> ,请调用madvise(MADV_DONTNEED)
- 这将清除页面,并从零池中返回新页面再次访问它们。