2014-05-01 106 views
1

我正在使用一些進程,信號量和映射內存在C中編寫程序。當我映射內存,然後程序在進程中失敗,所以無法進入釋放內存的階段,程序就停止了,我必須殺死它(Ctrl + C)。在Linux中kill後釋放內存

問題是,當我修復錯誤並再次運行程序 - 它調用共享內存錯誤或信號量錯誤,程序終止。我只能通過重新啓動整個操作系統來解決此問題。

有沒有另一種方式,如何在釋放意外錯誤後「釋放」分配的內存?

僅供參考:ipcs不顯示此分配的內存,也不顯示使用的信號量。

編輯:我不得不標記一個「正確」的答案,但我想感謝大家的想法。結果是,在問題發生後,刪除/ dev/shm文件夾中除pulse之外的所有內容都是解決方案。

+2

我不相信'ipcs'會顯示POSIX shm段(即'shm_open()'),但不會顯示SysV IPC(例如'shmget')。 –

+0

所以你說 - 因爲我使用POSIX的方式,我將永遠不得不重新啓動操作系統? – Croolman

+0

您可以添加SIGINT/SIGTERM處理程序來取消映射內存。 – Andy

回答

2

POSIX共享內存沒有特定的命令行工具。但它通常映射到/ dev/shm樹中,您可以使用經典文件操作工具管理這些段。

2

Grapsus對POSIX共享內存的評論是正確的。忘記ipcrm,它只是SysV。在/ dev/shm中挖掘並刪除「代表」共享內存板的文件。

你可能還應該放入一個信號處理程序來刪除殺死時的共享內存。如果你要用SIG_KILL(9)殺死它,它將不起作用,但它可以用於大多數較小的殺死。一旦信號處理程序就位,定期殺死將調用處理程序,然後程序可以在程序關閉之前以編程方式刪除共享內存。