2013-02-26 53 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如果進程退出不當,將提供給獨立的進程。

因此,當進程崩潰時,共享內存應該沒有問題。