自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux inotify使用安裝創(chuàng)建設(shè)備

運(yùn)維 系統(tǒng)運(yùn)維
Linux inotify 是文件系統(tǒng)事件監(jiān)控機(jī)制,計(jì)劃包含在即將發(fā)布的 Linux 內(nèi)核中作為 dnotify 的有效替代。dnotify 是較早內(nèi)核支持的文件監(jiān)控機(jī)制。Linux inotify一種強(qiáng)大的、細(xì)粒度的、異步的機(jī)制,它滿足各種各樣的文件監(jiān)控需要,不僅限于安全和性能。

想知道到Linux inotify系統(tǒng)的真相么,想知道Linux inotify系統(tǒng)中藏有的內(nèi)在奧義么,只有我來給大家全面講解介紹Linux inotify系統(tǒng)使用 Linux inotify 監(jiān)控 Linux 文件系統(tǒng)事件.
 
Linux inotify 是文件系統(tǒng)事件監(jiān)控機(jī)制,計(jì)劃包含在即將發(fā)布的 Linux 內(nèi)核中作為 dnotify 的有效替代。dnotify 是較早內(nèi)核支持的文件監(jiān)控機(jī)制。Linux inotify一種強(qiáng)大的、細(xì)粒度的、異步的機(jī)制,它滿足各種各樣的文件監(jiān)控需要,不僅限于安全和性能。

下面讓我們一起學(xué)習(xí)如何安裝 Linux inotify 和如何構(gòu)建一個(gè)示例用戶空間應(yīng)用程序來響應(yīng)文件系統(tǒng)事件。文件系統(tǒng)事件監(jiān)控對于從文件管理器到安全工具的各種程序都是必要的,但是 dnotify(早期內(nèi)核中的標(biāo)準(zhǔn))存在一些局限性,這使我們期待出現(xiàn)一種更加完善的機(jī)制。抱著這種期待,我們發(fā)現(xiàn)了 Linux inotify,一種更加現(xiàn)代化的文件系統(tǒng)事件監(jiān)控替代品。

為什么使用 Linux inotify?

使用 Linux inotify 取代 dnotify 的原因有很多。***個(gè)原因是,dnotify 需要您為每個(gè)打算監(jiān)控是否發(fā)生改變的目錄打開一個(gè)文件描述符。當(dāng)同時(shí)監(jiān)控多個(gè)目錄時(shí),這會(huì)消耗大量的資源,因?yàn)橛锌赡苓_(dá)到每個(gè)進(jìn)程的文件描述符限制。

除此之外,文件描述符會(huì)鎖定目錄,不允許卸載(unmount)支持的設(shè)備,這在存在可移動(dòng)介質(zhì)的環(huán)境中會(huì)引發(fā)問題。在使用 Linux inotify 時(shí),如果正在監(jiān)控被卸載的文件系統(tǒng)上的文件,那么監(jiān)控會(huì)被自動(dòng)移除并且您會(huì)接收到一個(gè)卸載事件。

dnotify 不如 Linux inotify 的第二個(gè)原因是 dnotify 有點(diǎn)復(fù)雜。注意,使用 dnotify 基礎(chǔ)設(shè)施的簡單文件系統(tǒng)監(jiān)控粒度只停留于目錄級別。為了使用 dnotify 進(jìn)行更細(xì)粒度的監(jiān)控,應(yīng)用程序編程人員必須為每個(gè)受監(jiān)控的目錄保留一個(gè) stat 結(jié)構(gòu)的緩存。

該用戶空間的 stat 結(jié)構(gòu)緩存需要用來明確確定當(dāng)接收到通知信號(hào)時(shí)目錄發(fā)生了什么變化。當(dāng)獲得通知信號(hào)時(shí),生成 stat 結(jié)構(gòu)列表并與***的狀態(tài)相比較。顯而易見,這種技術(shù)是不理想的。

Linux inotify 的另一個(gè)優(yōu)點(diǎn)是它使用文件描述符作為基本接口,使應(yīng)用程序開發(fā)者使用 select 和 poll 來監(jiān)控設(shè)備。這允許有效的多路 I/O 和與 Glib 的 mainloop 的集成。相反,dnotify 所使用的信號(hào)常常使程序員頭疼并且感覺不太優(yōu)雅。

Linux inotify 通過提供一個(gè)更優(yōu)雅的 API 解決了這些問題,該 API 使用最少的文件描述符,并確保更細(xì)粒度的監(jiān)控。與 Linux inotify 的通信是通過設(shè)備節(jié)點(diǎn)提供的。基于以上原因,對于監(jiān)控 Linux 2.6 平臺(tái)上的文件,Linux inotify 是您最明智的選擇。

回頁首安裝 Linux inotify

安裝 Linux inotify 的***步是確定您使用的 Linux 內(nèi)核是否支持它。檢查發(fā)行版的最簡單方法是,尋找是否存在 /dev/Linux inotify 設(shè)備。如果存在該設(shè)備,您可以跳到 在簡單應(yīng)用程序中使用 Linux inotify 一節(jié)。

在撰寫本文時(shí),Linux inotify 包含在 Andrew Morton 的 Linux 2.6-mm 目錄樹中,而且一些 Linux 發(fā)行版正在提供支持 Linux inotify 的內(nèi)核(包括 Gentoo 和 Ubuntu)或者具有提供支持的補(bǔ)充內(nèi)核包(例如 Fedora 和 SuSE)。

因?yàn)?Andrew 可能會(huì)根據(jù)需要從目錄樹刪除對 Linux inotify 的支持,并且 Linux inotify 版本還處于頻繁的開發(fā)階段,所以強(qiáng)烈建議您從頭開始打補(bǔ)丁。 如果缺少該設(shè)備,您可能需要對內(nèi)核打補(bǔ)丁并創(chuàng)建該設(shè)備。

為 Linux inotify 對內(nèi)核打補(bǔ)丁可以從 Linux Kernel Archives 獲得 Linux inotify 補(bǔ)?。ㄕ垍㈤?參考資料 一節(jié)的鏈接)。 您應(yīng)該為特定的內(nèi)核應(yīng)用***版本編號(hào)的補(bǔ)丁。每個(gè)發(fā)行版處理內(nèi)核的安裝都有所不同,但以下介紹的是一個(gè)通用指導(dǎo)。注意:從 Linux Kernel Archives 獲取發(fā)行版 2.6 Linux 內(nèi)核源文件,如果合適,請獲取***的穩(wěn)定版本。

從進(jìn)入內(nèi)核源文件目錄開始: bash:~$ cd /usr/src 因?yàn)槟缦劝惭b了內(nèi)核源文件,現(xiàn)在需要將它解壓縮: bash:~$ sudo tar jxvf linux-source-2.6.8.1.tar.bz2 現(xiàn)在,使您的 symlink 指向新的源文件目錄樹: bash:~$ sudo ln -sf linux-source-2.6.8.1 linux 改變當(dāng)前目錄到剛才創(chuàng)建的內(nèi)核源文件目錄:

bash:~$ cd linux 拷貝 Linux inotify 補(bǔ)?。?bash:~$ sudo cp ~/Linux inotify* /usr/src 將內(nèi)核打補(bǔ)?。?bash:~$ sudo patch -p1 < ../Linux inotify*.patch 構(gòu)建內(nèi)核: bash:~$ sudo make menuconfig

像平時(shí)一樣配置您的內(nèi)核,確保 Linux inotify 工作正常。如果必要,請將新內(nèi)核添加到引導(dǎo)加載程序中,但是一定要記住維護(hù)舊內(nèi)核的映像和引導(dǎo)加載程序選項(xiàng)。這一步對于不同引導(dǎo)加載程序有所不同(請參閱 參考資料 了解關(guān)于特定引導(dǎo)加載程序的更多信息)。

重新引導(dǎo)計(jì)算機(jī)并選擇啟用 Linux inotify 的新內(nèi)核。在繼續(xù)往下操作前,測試您的新內(nèi)核以確保它工作正常。

創(chuàng)建 Linux inotify 設(shè)備

接下來,您需要確保創(chuàng)建 /dev/Linux inotify 設(shè)備。以下步驟帶領(lǐng)您完成這個(gè)過程。重要注意:次設(shè)備編號(hào)可能會(huì)發(fā)生改變,所以您需要多加注意以確保它隨時(shí)更新!如果 Linux 安裝支持 udev 功能,它將會(huì)自動(dòng)保持更新。

在重新引導(dǎo)到新內(nèi)核后,您必須獲取次設(shè)備編號(hào): bash:~$ dmesg | grep ^Linux inotify 返回結(jié)果示例如下: Linux inotify device minor=63 因?yàn)?Linux inotify 是 misc 設(shè)備,所以主設(shè)備編號(hào)是 10。要?jiǎng)?chuàng)建設(shè)備節(jié)點(diǎn)作為根用戶,請執(zhí)行以下命令: bash:~$ mknod /dev/Linux inotify c 10 63

注意:如有必要,請使用合適的次設(shè)備編號(hào)替換“63”。 您可以隨意設(shè)置您想要的權(quán)限。一個(gè)示例權(quán)限設(shè)置如下所示: bash:~$ chown root:root /dev/Linux inotify bash:~$ chmod 666 /dev/Linux inotify 現(xiàn)在準(zhǔn)備使用 Linux inotify 設(shè)備進(jìn)行文件系統(tǒng)監(jiān)控。 回頁首

在簡單應(yīng)用程序中使用 Linux inotify為演示 Linux inotify 的使用,我將展示如何為文件系統(tǒng)事件構(gòu)造一個(gè)監(jiān)控任意目錄(或單個(gè)文件)的示例程序。我將站在一個(gè)較高的層次上來展示 Linux inotify 使文件系統(tǒng)監(jiān)控變得多么容易。

Main 方法這個(gè)簡單的示例向我們展示 Linux inotify 在任意目錄上設(shè)置監(jiān)控是多么容易。稍后我們將看到主要的幫助器例程。您可以在本文的 下載 一節(jié)獲取這些例子中使用的示例代碼。

清單 1. 在目錄上設(shè)置監(jiān)控

  1. /* This program will take as argument a directory name and monitor it,  
  2. printing event notifications to the console.  
  3. */  
  4. int main (int argc, char **argv)  
  5. {  
  6. /* This is the file descriptor for the Linux inotify device */  
  7. int Linux inotify_fd;  
  8. /* First we open the Linux inotify dev entry */  
  9. Linux inotify_fd = open_Linux inotify_dev();  
  10. if (Linux inotify_fd < 0)  
  11. {  
  12. return 0;  
  13. }  
  14. /* We will need a place to enqueue Linux inotify events,  
  15. this is needed because if you do not read events  
  16. fast enough, you will miss them.  
  17. */  
  18. queue_t q;  
  19. q = queue_create (128);  
  20. /* Watch the directory passed in as argument  
  21. Read on for why you might want to alter this for  
  22. more efficient Linux inotify use in your app.  
  23. */  
  24. watch_dir (Linux inotify_fd, argv[1], ALL_MASK);  
  25. process_Linux inotify_events (q, Linux inotify_fd);  
  26. /* Finish up by destroying the queue, closing the fd,  
  27. and returning a proper code  
  28. */  
  29. queue_destroy (q);  
  30. close_Linux inotify_dev (Linux inotify_fd);  
  31. return 0;  
  32. }  


重要的幫助器方法

以下是每個(gè)基于 Linux inotify 的應(yīng)用程序共同的最重要的幫助器例程: 為讀取而打開 Linux inotify 設(shè)備。 對從該設(shè)備讀取的事件進(jìn)行排隊(duì)。 允許應(yīng)用程序?qū)κ录ㄖM(jìn)行有用處理的實(shí)際的每事件處理器。

我不會(huì)深入鉆研事件排隊(duì)的細(xì)節(jié),因?yàn)槲覀兡軌蚴褂靡恍┎呗詠肀苊馀抨?duì)。提供的代碼中就展示了一個(gè)這樣的方法;更先進(jìn)的多線程方法可以并且已經(jīng)在其他地方實(shí)現(xiàn)。在那些實(shí)現(xiàn)中,讀者線程簡單地在 Linux inotify 設(shè)備上執(zhí)行 select(),然后將事件拷貝到一些線程共享的存儲(chǔ)空間(或者一些像 Glib 的異步消息隊(duì)列的東西),以后處理器線程會(huì)處理這里的事件。

清單 2. 打開 Linux inotify 設(shè)備

  1. /* This simply opens the Linux inotify node in dev (read only) */  
  2. int open_Linux inotify_dev ()  
  3. {  
  4. int fd;  
  5. fd = open("/dev/Linux inotify", O_RDONLY);  
  6. if (fd < 0)  
  7. {  
  8. perror ("open(\"/dev/Linux inotify\", O_RDONLY) = ");  
  9. }  
  10. return fd;  
  11. }  

這對任何一個(gè)在 Linux 系統(tǒng)上進(jìn)行過文件編程的人來說都應(yīng)該是熟悉的。

清單 3. 實(shí)際的事件處理例程

  1. /* This method does the dirty work of determining what happened,  
  2. then allows us to act appropriately  
  3. */  
  4. void handle_event (struct Linux inotify_event *event)  
  5. {  
  6. /* If the event was associated with a filename, we will store it here */  
  7. char * cur_event_filename = NULL;  
  8. /* This is the watch descriptor the event occurred on */  
  9. int cur_event_wd = event->wd;  
  10. if (event->len)  
  11. {  
  12. cur_event_filename = event->filename;  
  13. }  
  14. printf("FILENAME=%s\n", cur_event_filename);  
  15. printf("\n");  
  16. /* Perform event dependent handler routines */  
  17. /* The mask is the magic that tells us what file operation occurred */  
  18. switch (event->mask)  
  19. {  
  20. /* File was accessed */  
  21. case IN_ACCESS:  
  22. printf("ACCESS EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  23. cur_event_filename, cur_event_wd);  
  24. break;  
  25. /* File was modified */  
  26. case IN_MODIFY:  
  27. printf("MODIFY EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  28. cur_event_filename, cur_event_wd);  
  29. break;  
  30. /* File changed attributes */  
  31. case IN_ATTRIB:  
  32. printf("ATTRIB EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  33. cur_event_filename, cur_event_wd);  
  34. break;  
  35. /* File was closed */  
  36. case IN_CLOSE:  
  37. printf("CLOSE EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  38. cur_event_filename, cur_event_wd);  
  39. break;  
  40. /* File was opened */  
  41. case IN_OPEN:  
  42. printf("OPEN EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  43. cur_event_filename, cur_event_wd);  
  44. break;  
  45. /* File was moved from X */  
  46. case IN_MOVED_FROM:  
  47. printf("MOVE_FROM EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  48. cur_event_filename, cur_event_wd);  
  49. break;  
  50. /* File was moved to X */  
  51. case IN_MOVED_TO:  
  52. printf("MOVE_TO EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  53. cur_event_filename, cur_event_wd);  
  54. break;  
  55. /* Subdir was deleted */  
  56. case IN_DELETE_SUBDIR:  
  57. printf("DELETE_SUBDIR EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  58. cur_event_filename, cur_event_wd);  
  59. break;  
  60. /* File was deleted */  
  61. case IN_DELETE_FILE:  
  62. printf("DELETE_FILE EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  63. cur_event_filename, cur_event_wd);  
  64. break;  
  65. /* Subdir was created */  
  66. case IN_CREATE_SUBDIR:  
  67. printf("CREATE_SUBDIR EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  68. cur_event_filename, cur_event_wd);  
  69. break;  
  70. /* File was created */  
  71. case IN_CREATE_FILE:  
  72. printf("CREATE_FILE EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  73. cur_event_filename, cur_event_wd);  
  74. break;  
  75. /* Watched entry was deleted */  
  76. case IN_DELETE_SELF:  
  77. printf("DELETE_SELF EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  78. cur_event_filename, cur_event_wd);  
  79. break;  
  80. /* Backing FS was unmounted */  
  81. case IN_UNMOUNT:  
  82. printf("UNMOUNT EVENT OCCURRED: File \"%s\" on WD #%i\n",  
  83. cur_event_filename, cur_event_wd);  
  84. break;  
  85. /* Too many FS events were received without reading them  
  86. some event notifications were potentially lost.  */  
  87. case IN_Q_OVERFLOW:  
  88. printf("Warning: AN OVERFLOW EVENT OCCURRED: \n");  
  89. break;  
  90. case IN_IGNORED:  
  91. printf("IGNORED EVENT OCCURRED: \n");  
  92. break;  
  93. /* Some unknown message received */  
  94. default:  
  95. printf ("UNKNOWN EVENT OCCURRED for file \"%s\" on WD #%i\n",  
  96. cur_event_filename, cur_event_wd);  
  97. break;  
  98. }  
  99. }  

在每一條 case 語句中,您可以隨意執(zhí)行任意已實(shí)現(xiàn)并且滿足需要的方法。 至于性能監(jiān)控,您可以確定哪些文件是最經(jīng)常被讀取的和它們打開的持續(xù)時(shí)間。這種監(jiān)控非常方便,因?yàn)樵谀承┣闆r下,如果文件在短時(shí)間內(nèi)被應(yīng)用程序重復(fù)地讀取,它會(huì)將文件緩存在內(nèi)存中而不用返回磁盤去讀取,從而提高性能。

很容易舉出一些執(zhí)行有趣操作的特定于事件的處理器的例子。比如,如果您是在為底層文件系統(tǒng)實(shí)現(xiàn)一個(gè)元數(shù)據(jù)存儲(chǔ)索引,您可能會(huì)尋找文件創(chuàng)建事件,不久還會(huì)在該文件上觸發(fā)一個(gè)元數(shù)據(jù)挖掘操作。在安全環(huán)境中,如果文件被寫入一個(gè)無人可以寫入的目錄,您會(huì)觸發(fā)某些形式的系統(tǒng)警報(bào)。

請注意,Linux inotify 支持許多非常細(xì)粒度的事件 —— 例如 CLOSE 與 CLOSE_WRITE。 本文中的代碼所列舉的許多事件,可能您并不希望在每次代碼運(yùn)行時(shí)都看到。實(shí)際上,只要可能,您可以并且應(yīng)該只請求對您的應(yīng)用程序有用的事件子集。

出于測試目的,本文章提供的代碼通過嚴(yán)格使用完整掩碼(如可下載的示例代碼[請參閱 參考資料] 中 main 方法的第 51 行附近或者上面的 清單 1 中的第 29 行所執(zhí)行的)展示了許多事件。應(yīng)用程序員通常想要有更多選擇,而您則需要更特定的掩碼來滿足您的需要。這使您可以從上述的 handle_event() 方法中的 catch 語句刪除不感興趣的條目。

【編輯推薦】

  1. Linux locale手工掛載內(nèi)核內(nèi)核
  2. 有關(guān)Linux創(chuàng)建用戶命令的詳細(xì)討論
  3. Linux Makefile介紹自動(dòng)編譯和鏈接
  4. Linux分區(qū)方案深度討論
  5. Linux SNMP相關(guān)知識(shí)與RRD數(shù)據(jù)庫更新
責(zé)任編輯:佚名 來源: csdn
相關(guān)推薦

2021-10-15 10:05:04

物聯(lián)網(wǎng)安全設(shè)備

2017-10-11 14:45:58

Linuxinotify功能實(shí)現(xiàn)原理

2010-11-04 10:16:11

inotify監(jiān)控Linux文件系統(tǒng)

2010-02-25 17:36:38

Linux USB

2009-10-28 12:05:32

linux監(jiān)控技術(shù)

2014-05-12 16:40:13

Linux命令快照

2010-05-10 15:14:13

inotifyLinux文件系統(tǒng)

2020-10-10 19:30:25

lshwLinux設(shè)備信息

2010-05-07 15:40:18

ibmdwLinux

2009-09-11 08:36:16

linux塊字符設(shè)備linux操作系統(tǒng)

2010-02-03 13:58:42

Linux Trac

2010-02-07 14:57:37

Ubuntu samb

2018-11-26 08:45:29

Linux驅(qū)動(dòng)程序命令

2009-06-26 17:33:30

Wiresharkpcaplinux

2010-02-03 15:54:58

Linux SVN安裝

2020-05-09 12:01:40

Linux開源軟件SDN

2012-09-12 09:10:23

Android虛擬設(shè)備創(chuàng)建指南

2021-05-27 09:57:55

Inotify監(jiān)控系統(tǒng)

2011-01-11 15:16:37

2018-02-26 08:14:20

LinuxDocker容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)