linux inotify 觸發點探秘

2021-10-07 01:26:21 字數 1020 閱讀 2300

之前寫過一篇通過inotify來實現高效能的檔案佇列的文章,對inotify觸發的點有些疑問,到底是底層檔案發生變化後才trigger event還是在write complete後才觸發的event。有必要搞清楚這個問題。

檢視vfs write相關原始碼

static ssize_t __vfs_write(struct file *file, const char __user *p,

size_t count, loff_t *pos)

ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos)

inc_syscw(current);

return ret;

}

我們發現在寫入前核心進行了簡單的許可權校驗之後呼叫了__vfs_write這個函式,然而這個函式也就是各個檔案系統對write,read等系統的實現。然後我們可以看見呼叫了fsnotify_modify去觸發事件。好了,我們接下來就要搞清楚__vfs_write這個函式究竟幹了些什麼。

首先我們看一張

我們來看看普通的write操作

使用者發起write操作

作業系統查詢頁快取

若未命中,則產生缺頁異常,然後建立頁快取,將使用者傳入的內容寫入頁快取。若命中,則直接將使用者傳入的內容寫入頁快取

使用者write呼叫完成

頁被修改後成為髒頁,作業系統有兩種機制將髒頁寫回磁碟,使用者手動呼叫fsync()或者由pdflush程序定時將髒頁寫回磁碟

我們inotify其實也就是在write到buffer cache後就觸發了。沒有等到資料持久化到fs後才觸發。在機器上執行iostat -x 1 10命令也會發現對應的磁碟的w 和r都很低,我們的大部分請求都命中了cache,根本沒有到磁碟。通過inotify加檔案的形式效能基本等價於直接寫記憶體。

js觸發點選事件

最簡單的觸發單擊事件肯定是elem.click 平時在不需要考慮相容性的場合我都是這麼幹的,但是畢竟這個方法有相容性 具體相容性如何沒做過測試 所以還是要掌握乙個通用的方法。以下 是網上比較容易找到的一段 我在前面加了一段mouseevent的判斷 觸發單擊事件 param elem 需要觸發事件的...

onmousemove拖動的時候不觸發點選效果

先編寫乙個跨瀏覽器繫結事件的物件吧 var eventutil else if element.attachevent else 移除繫結事件 removehandler function element,type,handler else if element.detachevent else 獲...

造假觸發點選上傳檔案效果

w3c dtd xhtml 1.0 transitional en file id file id onchange txt id value this.value text id txt id value 這是假的!button id btn id value 假瀏覽 造假。將file元素通過po...