如果其中一个进程意外死亡,进程间内存会发生什么?

NoS*_*tAl 4 c++ linux shared-memory

如果你对动机感兴趣我会在接下来的几句中详细阐述它,如果不是只是跳到Q.

我正在考虑制作快速记录器但是在程序崩溃时没有受到影响的记录器(也就是少数最后一次记录消息没有丢失).所以我的想法是写入共享内存(ringbuffer)并从中读取另一个低prio进程并进行转储.但为了工作,我需要知道如果一个进程退出(正常退出,SEGFAULT)共享内存会发生什么...

所以我的问题是:当其中一个触发器死掉时,共享内存会发生什么(在Linux中,但你也可以在A中获胜)是UB吗?

BЈо*_*вић 6

当其中一个触发器死亡时,共享内存会发生什么(在Linux中,但你也可以在A中获胜)

没有.当进程终止时,共享内存保持不变.它被映射为目录下的/dev/shm/文件.它在系统重新启动时或当所有进程取消映射共享内存文件并被shm_unlink()调用时被删除.

是UB吗?

不,它定义明确.请参见shm_overview(7)手册页:

POSIX共享内存对象具有内核持久性:共享内存对象将一直存在,直到系统关闭,或者直到所有进程都已取消映射该对象并且已使用shm_unlink删除它(3)

  • @NoSenseEtAl打开共享内存与打开文件相同。当进程终止时,操作系统应在此之后进行清理。我会说,除非有操作系统错误(极不可能),否则这种情况会发生 (2认同)
  • @BЈовић 您关于“操作系统应该清理它”的评论是否与 shm_overview 语句的人(在上面的答案中引用)相矛盾,即“共享内存对象将存在,直到系统关闭,或者直到所有进程都取消映射”该对象已被 shm_unlink(3) 删除”?内核持久性确实意味着该对象将持续存在,直到操作系统内核重新启动或它被显式删除,不是吗? (2认同)