在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
这个程序将实时监控指定目录的变化,并在控制台输出相关事件。