是否可以安全地在共享内存对象完成后对其进行ftruncate?

时间:2012-10-29 16:55:14

标签: linux memory-management posix shared-memory

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

这一点是为了确保fork()生成的每个进程在同一地址都有一个共享段。然而,我不想让RAM一直保持忙碌,而是动态调整它的大小(大小为0 - 大length)。

这可以吗?有UB吗?

3 个答案:

答案 0 :(得分:8)

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

来自man 2 mmap

  

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

     

SIGBUS尝试访问与之对应的缓冲区的一部分                 文件(例如,超出文件末尾,包括案例                 其他进程截断文件的位置。)

答案 1 :(得分:1)

不要调整它的大小。

  

我不想让RAM一直保持忙碌

这就是内核为虚拟内存做的事情。只要您不使用mlock()MAP_LOCKED,就会根据需要进行分页。

答案 2 :(得分:1)

根据需要创建大小的映射,除非您实际使用它,否则不会“保持RAM忙”。

如果你担心在完成后使用> ,请调用madvise(MADV_DONTNEED) - 这将清除页面,并从零池中返回新页面再次访问它们。