溫馨提示×

Debian inotify是否有API接口可用

小樊
44
2025-10-19 07:57:06
欄目: 智能運維

Debian系統中inotify提供完整的API接口,支持應用程序通過系統調用實時監控文件或目錄的變化(如創建、刪除、修改等)。這些API屬于Linux內核子系統,Debian通過libinotify-dev開發庫提供頭文件和鏈接庫支持。

一、主要API接口及功能

inotify的核心API是一組系統調用,用于管理監控實例、添加/移除監控項及讀取事件,具體如下:

1. inotify_init / inotify_init1

創建一個inotify實例,返回對應的文件描述符(fd)。inotify_init1是擴展版本,支持額外標志(如IN_NONBLOCK實現非阻塞模式)。

2. inotify_add_watch

向inotify實例的“監控列表”中添加一個路徑(文件或目錄),并指定感興趣的事件類型(通過mask參數,如IN_CREATE、IN_DELETE、IN_MODIFY)。返回一個唯一的“監控描述符”(wd),用于后續操作。

3. inotify_rm_watch

從inotify實例的監控列表中移除指定監控描述符(wd)的項。當所有關聯的文件描述符關閉時,監控會自動釋放。

4. read

從inotify文件描述符中讀取事件。若設置為阻塞模式,read會等待直到有事件發生;返回的事件數據為struct inotify_event結構體(包含事件類型、文件名等信息)。

5. close

關閉inotify文件描述符,釋放相關資源。當所有關聯的fd關閉時,內核會自動釋放監控列表。

二、Debian中使用inotify API的前提條件

需安裝libinotify-dev開發庫,提供API的頭文件(sys/inotify.h)和鏈接庫:

sudo apt update
sudo apt install libinotify-dev

三、簡單示例(C語言)

以下代碼演示如何監控指定目錄的文件創建、刪除、修改事件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/inotify.h>
#include <unistd.h>

#define EVENT_SIZE  (sizeof(struct inotify_event))
#define BUF_LEN     (1024 * (EVENT_SIZE + 16))

int main(int argc, char **argv) {
    int fd, wd, length, i = 0;
    char buffer[BUF_LEN];

    if (argc != 2) {
        printf("Usage: %s <directory>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    // 初始化inotify實例
    fd = inotify_init();
    if (fd < 0) {
        perror("inotify_init");
        exit(EXIT_FAILURE);
    }

    // 添加監控項(監控目錄的創建、刪除、修改事件)
    wd = inotify_add_watch(fd, argv[1], IN_CREATE | IN_DELETE | IN_MODIFY);
    if (wd < 0) {
        perror("inotify_add_watch");
        exit(EXIT_FAILURE);
    }

    printf("Monitoring directory: %s\n", argv[1]);

    // 循環讀取事件
    while (1) {
        length = read(fd, buffer, BUF_LEN);
        if (length < 0) {
            perror("read");
            exit(EXIT_FAILURE);
        }

        // 解析事件
        while (i < length) {
            struct inotify_event *event = (struct inotify_event *)&buffer[i];
            if (event->len) {
                if (event->mask & IN_CREATE)
                    printf("Created: %s\n", event->name);
                else if (event->mask & IN_DELETE)
                    printf("Deleted: %s\n", event->name);
                else if (event->mask & IN_MODIFY)
                    printf("Modified: %s\n", event->name);
            }
            i += EVENT_SIZE + event->len;
        }
        i = 0;
    }

    // 清理資源
    inotify_rm_watch(fd, wd);
    close(fd);
    return 0;
}

編譯并運行:

gcc -o inotify_example inotify_example.c -linotify
./inotify_example /path/to/directory

四、注意事項

  • 監控數量限制:默認最大監控數量為/proc/sys/fs/inotify/max_user_watches(可通過echo 65536 | sudo tee /proc/sys/fs/inotify/max_user_watches臨時調整)。
  • 性能優化:避免監控過多文件(如超過10萬個),可通過--exclude參數排除無關路徑。
  • 事件合并:inotify可能合并連續事件(如多次修改),需根據業務邏輯處理事件順序。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女