这样监控不到vi编辑器修改的文件
时间: 2024-03-05 18:51:33 浏览: 34
是的,因为 vi 编辑器在保存文件时并非直接修改原文件,而是先将修改后的内容写入一个临时文件,然后再将临时文件重命名为原文件名,这样会触发 inotify 的 IN_MOVED_FROM 和 IN_MOVED_TO 事件,而不是 IN_MODIFY 事件,因此需要在代码中增加对 IN_MOVED_FROM 和 IN_MOVED_TO 事件的处理。
以下是修改后的 C 代码示例,可以监控 vi 编辑器修改的文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/inotify.h>
#define EVENT_SIZE (sizeof(struct inotify_event))
#define EVENT_BUF_LEN (1024 * (EVENT_SIZE + 16))
int main() {
int fd, wd, length, i = 0;
char buffer[EVENT_BUF_LEN];
// 监控的文件路径
char *file_path = "/path/to/file";
// 初始化 inotify 实例
fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
exit(EXIT_FAILURE);
}
// 添加要监控的文件路径并指定监控事件类型
wd = inotify_add_watch(fd, file_path, IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO);
if (wd < 0) {
perror("inotify_add_watch");
exit(EXIT_FAILURE);
}
// 监控循环
while (1) {
i = 0;
length = read(fd, buffer, EVENT_BUF_LEN);
if (length < 0) {
perror("read");
exit(EXIT_FAILURE);
}
while (i < length) {
struct inotify_event *event = (struct inotify_event *) &buffer[i];
if (event->mask & IN_MODIFY) {
printf("File %s has been modified.\n", event->name);
} else if (event->mask & IN_MOVED_FROM) {
printf("File %s has been moved from.\n", event->name);
} else if (event->mask & IN_MOVED_TO) {
printf("File %s has been moved to.\n", event->name);
}
i += EVENT_SIZE + event->len;
}
}
// 关闭 inotify 实例
inotify_rm_watch(fd, wd);
close(fd);
return 0;
}
```
在修改后的代码中,将 inotify_add_watch() 的参数修改为 IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO,增加了对 IN_MOVED_FROM 和 IN_MOVED_TO 事件的处理。如果事件类型为 IN_MOVED_FROM,则输出文件已被移动的消息;如果事件类型为 IN_MOVED_TO,则输出文件已被移动到的消息。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)