Linux 目錄通知

Stephen Rothwell <sfr@canb.auug.org.au>

目錄通知的目的是允許使用者應用程式在目錄或其中的任何檔案發生更改時收到通知。 基本機制涉及應用程式使用 fcntl(2) 呼叫註冊目錄通知,通知本身使用訊號傳遞。

應用程式決定它想要被通知的“事件”。 當前定義的事件有

DN_ACCESS

目錄中的檔案被訪問(讀取)

DN_MODIFY

目錄中的檔案被修改(寫入,截斷)

DN_CREATE

在目錄中建立了一個檔案

DN_DELETE

從目錄中取消連結了一個檔案

DN_RENAME

目錄中的檔案被重新命名

DN_ATTRIB

目錄中的檔案屬性被更改(chmod, chown)

通常,應用程式必須在每次通知後重新註冊,但如果 DN_MULTISHOT 與事件掩碼進行或運算,則註冊將保持有效,直到顯式刪除(透過註冊不接收任何事件)。

預設情況下,SIGIO 將傳遞給程序,沒有其他有用的資訊。 但是,如果使用 F_SETSIG fcntl(2) 呼叫讓核心知道要傳遞哪個訊號,則會將一個 siginfo 結構傳遞給訊號處理程式,並且該結構的 si_fd 成員將包含與發生事件的目錄關聯的檔案描述符。

最好是應用程式選擇其中一個即時訊號 (SIGRTMIN + <n>),以便可以將通知排隊。 如果指定了 DN_MULTISHOT,這一點尤其重要。 請注意,SIGRTMIN 通常被阻塞,因此最好使用(至少)SIGRTMIN + 1。

實現期望(功能和錯誤 :-))

即使實際檔案系統位於遠端伺服器上,通知也應該適用於對檔案的任何本地訪問。 這意味著應該通知對本地使用者模式伺服器提供的檔案的遠端訪問。 此外,應該通知對本地核心 NFS 伺服器提供的檔案的遠端訪問。

為了儘可能減少對檔案系統程式碼的影響,已忽略了檔案的硬連結問題。 因此,如果檔案 (x) 存在於兩個目錄(a 和 b)中,則使用名稱“a/x”對檔案進行的更改應該通知給期望目錄“a”上的通知的程式,但不會通知給期望目錄“b”上的通知的程式。

此外,取消連結的檔案仍然會在它們連結到的最後一個目錄中觸發通知。

配置

Dnotify 透過 CONFIG_DNOTIFY 配置選項控制。 停用時,fcntl(fd, F_NOTIFY, ...) 將返回 -EINVAL。

示例

有關示例,請參見 tools/testing/selftests/filesystems/dnotify_test.c。

注意

從 Linux 2.6.13 開始,dnotify 已被 inotify 替換。 有關更多資訊,請參見Inotify - 一個強大而簡單的檔案更改通知系統