linux

如何用readdir实现Linux目录监控

小樊
33
2025-03-29 12:35:14
栏目: 智能运维

在Linux系统中,可以使用readdir函数来实现目录监控。readdir函数用于读取目录中的条目。以下是一个简单的示例,展示了如何使用readdir函数监控目录:

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

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
        return 1;
    }

    const char *dir_path = argv[1];
    DIR *dir = opendir(dir_path);
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

这个程序接受一个目录路径作为命令行参数,然后使用opendir函数打开目录。接着,它使用readdir函数读取目录中的每个条目,并将其名称打印到屏幕上。最后,使用closedir函数关闭目录。

需要注意的是,这个示例程序只是一次性地读取目录中的条目,而不是实时监控目录的变化。要实现实时监控,可以使用inotify接口。inotify是Linux内核提供的一种机制,用于监控文件系统事件。以下是一个使用inotify监控目录变化的简单示例:

#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[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
        return 1;
    }

    const char *dir_path = argv[1];
    int fd = inotify_init();
    if (fd < 0) {
        perror("inotify_init");
        return 1;
    }

    int wd = inotify_add_watch(fd, dir_path, IN_MODIFY | IN_CREATE | IN_DELETE);
    if (wd < 0) {
        perror("inotify_add_watch");
        return 1;
    }

    char buffer[BUF_LEN];
    while (1) {
        ssize_t length = read(fd, buffer, BUF_LEN);
        if (length < 0) {
            perror("read");
            return 1;
        }

        int i = 0;
        while (i < length) {
            struct inotify_event *event = (struct inotify_event *) &buffer[i];
            if (event->len) {
                if (event->mask & IN_MODIFY) {
                    printf("File %s modified\n", event->name);
                } else if (event->mask & IN_CREATE) {
                    printf("File %s created\n", event->name);
                } else if (event->mask & IN_DELETE) {
                    printf("File %s deleted\n", event->name);
                }
            }
            i += EVENT_SIZE + event->len;
        }
    }

    (void) inotify_rm_watch(fd, wd);
    (void) close(fd);
    return 0;
}

这个程序使用inotify_init函数创建一个inotify实例,然后使用inotify_add_watch函数添加一个监控项,指定要监控的目录和感兴趣的事件(例如文件修改、创建和删除)。接着,程序进入一个无限循环,使用read函数读取inotify实例的通知。当检测到目录中的事件时,程序会打印相应的消息。

要编译这个程序,可以使用以下命令:

gcc -o inotify_example inotify_example.c

然后运行程序,指定要监控的目录:

./inotify_example /path/to/directory

这个程序将实时监控指定目录的变化,并在控制台输出相关事件。

0
看了该问题的人还看了