簡體   English   中英

在應用程序崩潰時未刪除Unix域套接字文件

[英]Unix domain socket file not removed on application crash

我有一個Linux C ++應用程序,該應用程序通過Unix Domain Socket生成並與另一個進程交互。 這個新進程基本上只在任務欄中顯示當前正在運行的進程的圖標,並在該圖標中顯示一些菜單項。

問題:正常關閉主應用程序后,將刪除UDS文件。 但是,如果應用程序崩潰,則不會刪除此UDS文件,並且該文件會持續存在。

有什么方法可以在應用程序崩潰時通過編碼刪除UDS文件?

有什么方法可以在應用程序崩潰時通過編碼刪除UDS文件?

是。 有幾種方法取決於您使用潛在的非便攜式功能的能力。

使用單獨的過程:

使用單獨的過程來監視您的應用程序; 也許是您為此目的而寫的。 當此監視過程檢測到您的應用程序已結束時,它將檢查Unix域套接字文件。 如果找到,它將刪除它。 然后重新啟動應用程序(如果需要)。

使用“抽象套接字”:

我相信您也可以使用“抽象套接字”,盡管我自己還沒有嘗試過。

用於Unix域套接字的在線linux手冊頁描述了稱為“抽象套接字”的擴展。 它解釋說:“當關閉所有對套接字的打開的引用時,抽象套接字會自動消失。”

使用“封閉式語義”:

基於Linux的Unix域套接字手冊頁的注釋部分聲稱:“通常的UNIX封閉式語義適用;該套接字可以隨時取消鏈接,並且在最后一次關閉對它的引用時,它將最終從文件系統中刪除”。 即調用bind來創建套接字,等到客戶端連接后,再unlink套接字的unlink ,然后處理可能會崩潰的代碼。 但是,一旦從目錄條目中刪除套接字,新的客戶端連接嘗試將失敗。

使用潛在的解決方法

bind調用之前,請在套接字上使用SO_REUSEADDR 這可能允許應用程序重新啟動而無需刪除套接字。 我不知道這種行為是否為Unix套接字定義得很好。 它可能在一個平台上運行,但在另一個平台上不運行。

問題:正常關閉主應用程序后,將刪除UDS文件。 但是,如果應用程序崩潰,則不會刪除此UDS文件,並且該文件會持續存在。

處理Unix域套接字文件(它的可移植/標准版本)的另一種方法是在創建應用程序之前刪除應用程序中的套接字文件。 因此,在您的應用程序調用bind之前,它將使用unlink 只要這是創建此文件的唯一過程,就應該避免發生種族沖突。

但是請注意,如果您的應用程序以更高的特權運行(例如,使用set-user-ID功能以root身份運行),則使用unlink可能會打開潛在的安全漏洞。 然后,請確保用戶無法告訴應用程序用於套接字的路徑,並且該套接字所在的目錄都不能由用戶修改。 否則,用戶可以告訴應用程序套接字的完整路徑類似於/etc/passwd然后運行它以刪除該文件,即使他們自己的用戶沒有權限執行該操作。

當然,可以通過使用最少特權帳戶來獲得設置用戶ID特權或一起避免設置用戶ID來減輕這種損壞的可能性。 另一個緩解措施是不允許用戶指示應用程序為其套接字使用什么路徑-可能僅使用硬編碼的路徑名,而該用戶對該用戶的任何目錄都沒有寫權限,這可能是一個緩解方法。

不確定是否有幫助,但是您可以檢測到孤立的unix套接字。

您可以嘗試在啟動時鎖定文件或套接字。 如果鎖定成功,則意味着該套接字是孤立的並且可以刪除。 這是因為由於任何原因終止進程時,操作系統都會釋放文件鎖。

或者, bind到該unix套接字。 僅當套接字名稱未使用時, bind才會成功。

暫無
暫無

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

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