使用inotify检测linux目录内文件变化

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

#define ERROR(text) error(1, errno, "%s", text)

typedef struct test{
        int flag;
        const char *name;
}EventMask;

int freadsome(void *dest, size_t remain, FILE *file)
{
        char *offset = (char*)dest;
        while (remain) {
                int n = fread(offset, 1, remain, file);
                if (n==0) {
                        return -1;
                }
                remain -= n;
                offset += n;
        }
        return 0;
}

int main(int argc, char *argv[])
{
        const char *target;
        if (argc == 1) {
                target = ".";
        }
        else {
                target = argv[1];
        }

        EventMask event_masks[] = {
           {IN_ACCESS        , "IN_ACCESS"}        ,
           {IN_ATTRIB        , "IN_ATTRIB"}        ,
           {IN_CLOSE_WRITE   , "IN_CLOSE_WRITE"}   ,
           {IN_CLOSE_NOWRITE , "IN_CLOSE_NOWRITE"} ,
           {IN_CREATE        , "IN_CREATE"}        ,
           {IN_DELETE        , "IN_DELETE"}        ,
           {IN_DELETE_SELF   , "IN_DELETE_SELF"}   ,
           {IN_MODIFY        , "IN_MODIFY"}        ,
           {IN_MOVE_SELF     , "IN_MOVE_SELF"}     ,
           {IN_MOVED_FROM    , "IN_MOVED_FROM"}    ,
           {IN_MOVED_TO      , "IN_MOVED_TO"}      ,
           {IN_OPEN          , "IN_OPEN"}          ,

           {IN_DONT_FOLLOW   , "IN_DONT_FOLLOW"}   ,
           {IN_EXCL_UNLINK   , "IN_EXCL_UNLINK"}   ,
           {IN_MASK_ADD      , "IN_MASK_ADD"}      ,
           {IN_ONESHOT       , "IN_ONESHOT"}       ,
           {IN_ONLYDIR       , "IN_ONLYDIR"}       ,

           {IN_IGNORED       , "IN_IGNORED"}       ,
           {IN_ISDIR         , "IN_ISDIR"}         ,
           {IN_Q_OVERFLOW    , "IN_Q_OVERFLOW"}    ,
           {IN_UNMOUNT       , "IN_UNMOUNT"}       ,
        };

        int monitor = inotify_init();
        if ( -1 == monitor ) {
                ERROR("monitor");
        }

        int watcher = inotify_add_watch(monitor, target, IN_ALL_EVENTS);
        if ( -1 == watcher  ) {
                ERROR("inotify_add_watch");
        }

        FILE *monitor_file = fdopen(monitor, "r");
        char last_name[1024];
        char name[1024];
        /* event:inotify_event -> name:char[event.len] */

        while (1) {

                struct inotify_event event;
                if ( -1 == freadsome(&event, sizeof(event), monitor_file) ) {
                        ERROR("freadsome");
                }
                if (event.len) {
                        freadsome(name, event.len, monitor_file);
                } else {
                        sprintf(name, "FD: %d\n", event.wd);
                }

                if (strcmp(name, last_name) != 0) {
                        puts(name);
                        strcpy(last_name, name);
                }

                /* 显示event的mask的含义 */
                int i = 0;
                for (i=0; i<sizeof(event_masks)/sizeof(EventMask); ++i)
                {
                        if (event.mask & event_masks[i].flag) {
                                printf("\t%s\n", event_masks[i].name);
                        }
                }
        }
        return 0;
}
时间: 2024-08-24 01:13:22

使用inotify检测linux目录内文件变化的相关文章

Window Linux下实现指定目录内文件变更的监控方法

转自:http://qbaok.blog.163.com/blog/static/10129265201112302014782/ 对于监控指定目录内文件变更,window 系统提供了两个未公开API:SHChangeNotifyRegister  SHChangeNotifyDeregister 分别用于注册Notify以及监视. 同时,还提供了ReadDirectoryChangesW  函数(貌似NT以上可用). 在 .net framework 中,另提供了封装好的 FileSystem

linux 目录下文件批量植入和删除

linux目录下文件批量植入 [[email protected] http2]# find /usr/local/http2/htdocs/ -type f|xargs sed -i "1  i <script>alert(1)</script>" 其中上面的1 为文件的第一行 i为植入 批量删除: [[email protected] ~]# find /usr/local/http2/htdocs/ -type f|xargs sed -i '/<s

linux目录与文件关系之我见

Linux的文件系统存取之我见 学习linux中,受到此前用windows的习惯影响,经常会混淆linux文件的概念. 今天认真梳理了一下linux目录与文件的关系. Linux 文件系统不同于windows ,所有目录和文件都由 / 根目录而衍生. 文件的管理是由系统统一分发的一个唯一的inode号来进行管理的. Linux中,一切皆为文件,/ 目录也不例外,也是一个文件,文件的内容则是逻辑上在/ 目录下存着的目录以及文件的元信息[包括inode节点,文件名,大小,权限,所有者等等] 如下图所

linux目录或文件权限

linux目录或文件权限 字符 解析drwxr-xr-x 通过 ls -l 可以查看 目录 或 文件 的权限时间 大小 等信息, 权限 占据10 个字符,eg: "drwxrwxrwx" 格式: "目录标记" + “所有者操作权限” + “所有者所在组成员操作权限” + “其他人操作权限” 1.“目录标记”:  如果是目录 ‘d’ 否则 ‘-’ 2.“所有者操作权限” 和 “所有者所在组成员操作权限” 和 “其他人操作权限” 每段都站3位分别 可读(r)+可写(w)

Linux目录和文件高级操作精讲

博文目录 一.Linux目录结构 二.Linux查看文件内容基础命令 三.压缩和解压缩文件 四.vi文本编辑器 一.Linux目录结构 Linux目录结构采用树形目录结构,包含根目录和子目录. 1.根目录 所有分区.目录.文件等的位置起点,整个树形目录结构中,使用独立的一个"/"表示. 2.子目录 常见的子目录如/root./bin./boot./dev./etc./home./var./usr./sbin. 3.子目录的作用 二.Linux查看文件内容基础命令 1.cat--查看文件

Linux目录与文件的权限

零.Linux中的权限为什么重要? 权限直接关系数据安全! 一.用户基础概念: 所有者(owner):拥有这个文件的用户.一般拥有目录或文件的所有权限. 用户组(group):几个用户组成一个用户组,一般来说组内用户同时具有某些权限. 其他人(others):相对于owner和group的其他人.一般比前两者少某些权限. 二.目录与文件的权限的意义: 文件是实际包含数据的,一般文本文件.数据库文件.二进制可执行文件等,因此权限对于文件来说,意义如下: r(read):可读取此文件的实际内容,例如

Linux目录、文件的管理

centos目录结构 ls / 查看根目录下有哪些文件或者目录 bin 可执行文件的目录 sbin 存放root用户可执行文件目录 etc 配置文件 boot 引导文件 home 普通用户宿主目录 lib 系统的核心文件 lib64 系统的核心文件 dev 设备目录 mnt 临时目录挂载点 root root用户的宿主目录 tmp 临时目录(比较重要文件不要往这里面方法) var 经常发生变化的文件或者目录存放处 variable var a=1 usr 共享资源目录(一般软件安装,默认此目录)

Linux 目录和文件操作

Linux常用命令--目录和文件操作 [目录]删除.复制.移动 : 1.删除文件夹用:rmdir 文件夹名 但是rmdir不能删除非空的文件夹,那如何删除非空文件夹呢: 2.通常情况下,删除文件用:rm 文件名    -d或--directory 直接把欲删除的目录的硬连接数据删成0,删除该目录. -f或--force 强制删除文件或目录. -i或--interactive 删除既有文件或目录之前先询问用户. -r或-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理.

Linux目录与文件操作(总结)

一.Linux目录结构 二.查看文件内容对于一个文本格式的配置文件,可以有不同的查看方式来获知文件内容,如直接现显示整个文件内容(cat),分页显示查看文件内容(more,less),或者只查看文件开头(head)或者尾部(tail)的部分内容.下面详细介绍命令使用方法1.more命令2.less命令3.head命令4.tail命令三.检索文件内容1wc命令2.grep命令四.备份与恢复文档使用解压和压缩工具1.gzip和gunzip命令 五.使用tar归档和释放工具 tar命令2.tar命令进