2013-02-26 26 views
3

,如果你有兴趣的动机生病阐述其在接下来的几个句子,如果不只是跳到Q.如果某个进程意外死亡,进程内存会发生什么情况?

我在想做出快速记录但不影响当程序崩溃(又名最后几个日志中的一个信息不会丢失)。所以我的想法是写入共享内存(ringbuffer)并从中读取另一个低级prio进程并进行倾倒。 但对于工作,我需要知道发生了什么共享内存,如果一个进程退出(正常退出,段错误)......

所以我的问题是: 发生共享内存什么(在Linux中,但你可以A也赢了)当一个过程死亡?它是UB吗?

+0

由于写入共享内存实际上是在书写结束了一个文件,通过什么共享内存和独立的进程间接是这样做的益处,而不是直接写入日志文件W/O缓冲的? – 2013-02-26 13:37:19

+0

例如我可以(我认为:))写入并读取GB数据到1MB共享内存... – NoSenseEtAl 2013-02-26 14:22:03

回答

5

当一个特效死掉时,共享内存(在Linux中,但你也可以A for Win)会发生什么?

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

它是UB吗?

不,它是明确的。看到man page for shm_overview(7)

POSIX共享内存对象具有内核的持久性:共享内存对象会存在,直到系统关闭,或直到所有的进程有未映射的对象,并将其已经用shm_unlink(3)

删除
+0

很酷,清理(由操作系统)突然结束的进程减少了对该共享内存的引用,或者是永久泄漏? – NoSenseEtAl 2013-02-26 12:32:39

+1

@NoSenseEtAl打开共享内存与打开文件相同。当一个进程死亡时,操作系统应该在它之后清理。我会说这种情况发生,除非有操作系统错误(不太可能) – 2013-02-26 12:37:13

1

如果使用文件为后盾,为mmap,一切直到最后msync,或munmap如果进程退出不当,将提供给独立的进程。

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