日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

詳解Linux 2.6內(nèi)核新文件系統(tǒng)變化機(jī)制

本文詳細(xì)地介紹了在 Linux 2.6.13 內(nèi)核中新引入的文件系統(tǒng)變化通知機(jī)制 inotify,并舉例說(shuō)明了它的使用與典型應(yīng)用案例 。
一、引言
眾所周知,Linux 桌面系統(tǒng)與 MAC 或 Windows 相比有許多不如人意的地方,為了改善這種狀況,開源社區(qū)提出用戶態(tài)需要內(nèi)核提供一些機(jī)制,以便用戶態(tài)能夠及時(shí)地得知內(nèi)核或底層硬件設(shè)備發(fā)生了什么,從而能夠更好地管理設(shè)備,給用戶提供更好的服務(wù),如 hotplug、udev 和 inotify 就是這種需求催生的 。Hotplug 是一種內(nèi)核向用戶態(tài)應(yīng)用通報(bào)關(guān)于熱插拔設(shè)備一些事件發(fā)生的機(jī)制,桌面系統(tǒng)能夠利用它對(duì)設(shè)備進(jìn)行有效的管理,udev 動(dòng)態(tài)地維護(hù) /dev 下的設(shè)備文件,inotify 是一種文件系統(tǒng)的變化通知機(jī)制,如文件增加、刪除等事件可以立刻讓用戶態(tài)得知,該機(jī)制是著名的桌面搜索引擎項(xiàng)目 beagle 引入的,并在 Gamin 等項(xiàng)目中被應(yīng)用 。
事實(shí)上,在 inotify 之前已經(jīng)存在一種類似的機(jī)制叫 dnotify,但是它存在許多缺陷:
1.對(duì)于想監(jiān)視的每一個(gè)目錄,用戶都需要打開一個(gè)文件描述符,因此如果需要監(jiān)視的目錄較多,將導(dǎo)致打開許多文件描述符,特別是,如果被監(jiān)視目錄在移動(dòng)介質(zhì)上(如光盤和 USB 盤),將導(dǎo)致無(wú)法 umount 這些文件系統(tǒng),因?yàn)槭褂?dnotify 的應(yīng)用打開的文件描述符在使用該文件系統(tǒng) 。
2.dnotify 是基于目錄的,它只能得到目錄變化事件,當(dāng)然在目錄內(nèi)的文件的變化會(huì)影響到其所在目錄從而引發(fā)目錄變化事件,但是要想通過目錄事件來(lái)得知哪個(gè)文件變化,需要緩存許多 stat 結(jié)構(gòu)的數(shù)據(jù) 。
3.Dnotify 的接口非常不友好,它使用 signal 。
Inotify 是為替代 dnotify 而設(shè)計(jì)的,它克服了 dnotify 的缺陷,提供了更好用的,簡(jiǎn)潔而強(qiáng)大的文件變化通知機(jī)制:
1.Inotify 不需要對(duì)被監(jiān)視的目標(biāo)打開文件描述符,而且如果被監(jiān)視目標(biāo)在可移動(dòng)介質(zhì)上,那么在 umount 該介質(zhì)上的文件系統(tǒng)后,被監(jiān)視目標(biāo)對(duì)應(yīng)的 watch 將被自動(dòng)刪除,并且會(huì)產(chǎn)生一個(gè) umount 事件 。
2.Inotify 既可以監(jiān)視文件,也可以監(jiān)視目錄 。
3.Inotify 使用系統(tǒng)調(diào)用而非 SIGIO 來(lái)通知文件系統(tǒng)事件 。
4.Inotify 使用文件描述符作為接口,因而可以使用通常的文件 I/O 操作select 和 poll 來(lái)監(jiān)視文件系統(tǒng)的變化 。
Inotify 可以監(jiān)視的文件系統(tǒng)事件包括:
IN_ACCESS,即文件被訪問
IN_MODIFY,文件被 write
IN_ATTRIB,文件屬性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可寫文件被 close
IN_CLOSE_NOWRITE,不可寫文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移來(lái),如 mv、cp
IN_CREATE,創(chuàng)建新文件
IN_DELETE,文件被刪除,如 rm
IN_DELETE_SELF,自刪除,即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)刪除自己
IN_MOVE_SELF,自移動(dòng),即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)移動(dòng)自己
IN_UNMOUNT,宿主文件系統(tǒng)被 umount
IN_CLOSE,文件被關(guān)閉,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移動(dòng),等同于(IN_MOVED_FROM | IN_MOVED_TO)
注:上面所說(shuō)的文件也包括目錄 。

二、用戶接口
在用戶態(tài),inotify 通過三個(gè)系統(tǒng)調(diào)用和在返回的文件描述符上的文件 I/ 操作來(lái)使用,使用 inotify 的第一步是創(chuàng)建 inotify 實(shí)例:

int fd = inotify_init ();

每一個(gè) inotify 實(shí)例對(duì)應(yīng)一個(gè)獨(dú)立的排序的隊(duì)列 。
文件系統(tǒng)的變化事件被稱做 watches 的一個(gè)對(duì)象管理,每一個(gè) watch 是一個(gè)二元組(目標(biāo),事件掩碼),目標(biāo)可以是文件或目錄,事件掩碼表示應(yīng)用希望關(guān)注的 inotify 事件,每一個(gè)位對(duì)應(yīng)一個(gè) inotify 事件 。Watch 對(duì)象通過 watch描述符引用,watches 通過文件或目錄的路徑名來(lái)添加 。目錄 watches 將返回在該目錄下的所有文件上面發(fā)生的事件 。

推薦閱讀