簡體   English   中英

釋放信號處理程序內的內存

[英]freeing memory inside a signal handler

我正在編寫一個使用套接字的API。 在API中,我為各種項目分配內存。 我想確保關閉套接字並釋放內存以防有諸如Ctrl-C之類的信號。 在研究這個時,似乎free()不在安全功能列表(man 7信號)上,因此,我無法釋放信號處理程序內的內存。 我可以關閉套接字就好了。 有沒有想過如何釋放記憶? 提前謝謝您的時間。

或者,不要捕獲信號,只是讓操作系統處理清理工作,無論如何都要在進程清理過程中進行清理。 您沒有發布任何與流程無直接關系的資源,因此無需手動釋放它們。

一種技術(其他也存在):

  1. 讓你的程序運行一個主處理循環。
  2. 讓主處理循環檢查一個標志,看它是否應該“繼續運行”。
  3. 讓您的信號處理程序簡單地將“保持運行”標志設置為false,但不以其他方式終止程序。
  4. 讓您的主處理循環在退出之前進行內存清理。

這具有將分配和解除分配放置在用已知序列調用的代碼塊中的益處。 在處理相互關聯的對象的網絡時,這樣做可能是天賜之物,並且在試圖弄亂同一對象的兩個處理流程之間不存在競爭條件。

不要在處理程序中釋放。 相反,請向您的程序指出需要釋放的內容。 然后,檢測您的程序,這樣您就可以擺脫主要的上下文,而不是信號上下文。

你在寫一個圖書館或一個應用程序嗎? 如果您正在編寫庫,則無法安裝信號處理程序,這會與調用應用程序沖突。 應用程序的業務是處理此類信號(如果需要),然后對庫進行適當的清理調用(從信號處理程序上下文外部)。

當然,即使您正在編寫應用程序,也沒有理由處理SIGINT以關閉套接字和釋放內存。 處理信號的唯一原因是,如果您不想終止,或者您有未保存的數據或共享狀態 (如共享內存或文件系統中的內容)需要在終止之前進行清理。 釋放內存或關閉純粹由您自己的進程使用的文件描述符不是退出時需要執行的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM