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

Lor*_*one 7 linux posix memory-management shared-memory

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

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

这可以吗?有UB吗?

nne*_*neo 8

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

来自man 2 mmap:

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

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