gpt4 book ai didi

使用Inotify 监控目录与文件的方法详解

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章使用Inotify 监控目录与文件的方法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1. 监控路径并打印所有发生在该路径的事件. 代码如下

复制代码 代码如下

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/inotify.h> #include <unistd.h> #define EVENT_NUM 12 char *event_str[EVENT_NUM] = {  "IN_ACCESS",  "IN_MODIFY",  "IN_ATTRIB",  "IN_CLOSE_WRITE",  "IN_CLOSE_NOWRITE",  "IN_OPEN",  "IN_MOVED_FROM",  "IN_MOVED_TO",  "IN_CREATE",  "IN_DELETE",  "IN_DELETE_SELF",  "IN_MOVE_SELF" }; int main(int argc, char *argv[]) {  int fd;  int wd;  int len;  int nread;  char buf[BUFSIZ];  struct inotify_event *event;  int i;  if(argc < 2)  {   fprintf(stderr, "%s path\n", argv[0]);   return -1;  }  fd = inotify_init();  if( fd < 0 )  {   fprintf(stderr, "inotify_init failed\n");   return -1;  }  wd = inotify_add_watch(fd, argv[1], IN_ALL_EVENTS);  if(wd < 0)  {   fprintf(stderr, "inotify_add_watch %s failed\n", argv[1]);   return -1;  }  buf[sizeof(buf) - 1] = 0;  while( (len = read(fd, buf, sizeof(buf) - 1)) > 0 )  {   nread = 0;   while( len > 0 )   {    event = (struct inotify_event *)&buf[nread];    for(i=0; i<EVENT_NUM; i++)    {     if((event->mask >> i) & 1)     {      if(event->len > 0)       fprintf(stdout, "%s --- %s\n", event->name, event_str[i]);      else       fprintf(stdout, "%s --- %s\n", " ", event_str[i]);     }    }    nread = nread + sizeof(struct inotify_event) + event->len;    len = len - sizeof(struct inotify_event) - event->len;   }  }  return 0; } 。

运行 inotify_watch 监控一个目录

复制代码 代码如下

$ ./inotify_watch test/ ...   --- IN_OPEN   --- IN_CLOSE_NOWRITE .tmp.swp --- IN_CREATE .tmp.swp --- IN_OPEN .tmp.swpx --- IN_CREATE .tmp.swpx --- IN_OPEN .tmp.swpx --- IN_CLOSE_WRITE .tmp.swpx --- IN_DELETE .tmp.swp --- IN_CLOSE_WRITE .tmp.swp --- IN_DELETE .tmp.swp --- IN_CREATE .tmp.swp --- IN_OPEN .tmp.swp --- IN_MODIFY   --- IN_OPEN   --- IN_CLOSE_NOWRITE .tmp.swp --- IN_MODIFY ... 。

从上面的结果可以看到在 test 目录中使用 vim 创建一个 tmp 文件, 产生很多的冗杂事件. 因此需要对监控的事件做出小范围的选择而不是 IN_ALL_EVENTS . 2. IN_MOVE_SELF 和 IN_DELETE_SELF 事件 由于个人水平, 曾经对这两个事件的含义并没有理解正确. 当监控 path 时( path可以是文件或目录).

复制代码 代码如下

$ ./inotify_watch path 。

执行 。

复制代码 代码如下

$ rm -f path 。

则发生 IN_DELETE_SELF 事件; 执行 。

复制代码 代码如下

mv path path2 。

则发生 IN_MOVE_SELF 事件. 3. 监控目录和文件 监控目录中内容改变应监控的事件

复制代码 代码如下

IN_CREATE | IN_DELETE | IN_DELETE_SELF | IN_MODIFY | IN_MOVE_SELF | IN_MOVED_FROM | IN_MOVDED_TO 。

监控文件内容的改变应监控的事件

复制代码 代码如下

IN_DELETE_SELF | IN_MODIFY | IN_MOVE_SELF 。

最后此篇关于使用Inotify 监控目录与文件的方法详解的文章就讲到这里了,如果你想了解更多关于使用Inotify 监控目录与文件的方法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com