4

如果你对动机感兴趣,我会在接下来的几句话中详细说明,如果不直接跳到 Q。

我正在考虑制作快速记录器,但是当程序崩溃时不受影响的记录器(也就是一些最后的日志消息没有丢失)。所以我的想法是写入共享内存(环形缓冲区)并从中读取另一个低优先级进程并进行转储。但是为了让它工作,我需要知道如果一个进程退出(正常退出,SEGFAULT),共享内存会发生什么......

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

4

3 回答 3

6

当其中一个 proc 死机时,共享内存(在 Linux 中,但您也可以 A for Win)会发生什么情况?

没有。当一个进程死亡时,共享内存保持原样。它被映射为目录下的/dev/shm/文件。当系统重新启动时,或者当所有进程取消映射共享内存文件并shm_unlink()调用它时,它会被删除。

是UB吗?

不,它定义得很好。请参阅shm_overview(7) 的手册页

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

于 2013-02-26T12:30:26.817 回答
4

Read boost IPC mechanisms, they explain persistence concept about shared memory.

http://www.boost.org/doc/libs/1_53_0/doc/html/interprocess/some_basic_explanations.html#interprocess.some_basic_explanations.persistence

于 2013-02-26T13:38:12.410 回答
1

如果您使用文件作为支持mmap,则直到最后的所有内容msync,或者munmap如果进程正确退出,都将可供独立进程使用。

因此,当进程崩溃时,共享内存应该没有问题。

于 2013-02-26T12:32:20.137 回答