`
xinmingyao
  • 浏览: 21037 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用epoll + inotify监控文件

    博客分类:
  • c
 
阅读更多
#include <sys/epoll.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/inotify.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int
main (int argc, char *argv[])
{
  int i, epfd, nfds, fd;
  int wd;
  int length;

  char buffer[BUF_LEN];
  struct epoll_event ev, events[20];
  epfd = epoll_create (256);
  fd = inotify_init ();
  wd = inotify_add_watch (fd, "/home/cc/tmp",
                          IN_MODIFY | IN_CREATE | IN_DELETE);

  ev.data.fd = fd;
  ev.events = EPOLLIN | EPOLLET;

  epoll_ctl (epfd, EPOLL_CTL_ADD, fd, &ev);

  for (;;)
    {
      nfds = epoll_wait (epfd, events, 20, 500);

      for (i = 0; i < nfds; ++i)
        {
          if (events[i].data.fd == fd)

            {
              length = read (fd, buffer, BUF_LEN);

              if (length < 0)
                {
                  perror ("read");
                }

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


        }

    }



  return 0;
}
分享到:
评论

相关推荐

    inotify_epoll

    inotify,epoll

    poll和epoll内核源码剖析

    `epoll`的核心在于`epoll_ctl`(用于添加、删除和修改监控的文件描述符)和`epoll_wait`(用于等待事件发生)这两个函数。`epoll`利用了内核的红黑树数据结构和事件队列,实现了高效的事件分发。在内核源码中,`...

    Linux INotif机制详解及实例代码

    总之,Linux INotify机制为开发者提供了一种强大且灵活的工具,用于实时监控文件系统的变更,对于需要实时响应文件变化的应用程序,如文件同步、日志监控、索引更新等场景,有着极其重要的作用。通过理解和正确使用...

    实时监控某一个进程源码

    4. **文件系统事件监控(inotify)**:在Linux中,可以使用`inotify`API来监控文件系统事件,如进程的创建和删除,这可以帮助我们实时发现进程的启动和退出。 5. **守护进程(Daemon)**:为了持续监控进程,我们...

    File watcher in c++.zip

    实现文件监控功能,我们可以利用操作系统提供的文件系统通知机制,如Windows的FindFirstChangeNotification和FindNextChangeNotification,或者在Unix/Linux系统中的inotify。下面我们将深入探讨这两种方法。 1. **...

    Linux编程接口 - Linux和UNIX系统编程手册

    - **监控文件事件**:使用epoll和inotify等技术监控文件变化。 - **信号处理**:信号的发送与捕获。 - **高级定时器机制**:高级定时器的设计与实现。 - **进程创建与结束**:进程的生命周期管理。 - **程序执行**:...

    Unix编程API手册

    9. **Linux特定特性**:除了标准的UNIX接口,书中还介绍了Linux特有的功能,如epoll用于高效I/O多路复用,inotify用于文件系统监控,以及/proc文件系统等。 这本书不仅适合Linux开发者,由于其对POSIX标准的重视,...

    Python-Windows和Linux上的钩子和模拟键盘事件

    然而,Python通常会使用`inotify`模块来监控文件系统的变化,或者使用`epoll`或`poll`来监听套接字和其他I/O事件。对于键盘事件,Linux没有提供像Windows那样的全局键盘钩子。但你可以通过读取`/dev/input/event*`...

    一个简单的异步IO库

    监视文件状态变化可能是通过`inotify`系统调用实现的,可以实时跟踪文件或目录的创建、修改、删除等事件,这对于文件监控和日志处理非常有用。 在`Test_ev`这个测试文件中,可能包含了对上述功能的示例代码或测试...

    unix使用编程艺术

    - 使用 `inotify` 或者 `poll()` 来监听文件变化。 **2. 高并发Web服务器实现** - Web服务器需要能够处理大量的并发连接。 - 利用多线程或多进程模型可以有效提升并发能力。 - 考虑到资源占用和上下文切换开销,...

    Linux-UNIX系统编程手册(上册)1

    10. **Linux特定特性**:除了标准的UNIX接口,书中还特别关注了Linux特有的功能,如epoll用于高并发I/O事件的通知,inotify用于文件系统变化监控,以及/proc文件系统对内核状态的访问。 这本书不仅适用于Linux...

    Linux_UNIX系统编程手册(上下册)1

    本书不仅关注标准的UNIX接口(如POSIX.1-2001/SUSv3和POSIX.1-2008/SUSv4),还特别强调了Linux特有的功能,如epoll用于高效的I/O事件通知,inotify用于文件系统监控,以及/proc文件系统用于系统状态查询。...

    linux常用c函数

    此外,还有一些特定于Linux的系统调用,如`epoll`用于高效I/O事件处理,以及`inotify`用于文件系统监控。 通过深入理解这些C函数和系统调用,Linux开发者能够更好地利用系统的强大功能,编写出高效且可靠的程序。在...

    harmonyos底层是linux-Doc:文件

    监控网卡 patch: deb: portal: dpkg-symbols 内核初始化 nsq队列: ? linux inotify: rtc: linux不支持5G: 802-1.x: 下一代工业通信—TSN(时间敏感网络),工业物联网的助推器:QCA TSN相关协议标准 beacon帧字段...

    linux-c-function.rar_Linux c++ Function_UNIX_linux C chm_linux c

    3. **Linux特定函数**:Linux系统提供了一些特有的函数,如`openpty`用于创建伪终端,`epoll`用于高性能的I/O事件多路复用,`inotify`用于文件系统变化监控等。 4. **C++的系统交互**:虽然C++不是原生的系统编程...

Global site tag (gtag.js) - Google Analytics