• 一次c++监听Linux文件目录的实践


    目的:监听系统/data/system/dropbox目录,解析出crash和ANR,并上传云端。

    这里只记录如何监听这个目录和实践中遇到的问题。

    使用的到技术:

    1.inotify

    2.epoll

    3.thread

    环境:android系统

    demo测试:

    1.通过UI按钮触发启动监听,观察监听过程日志;

    2.通过UI按钮触发读取新增文件内容。

    首先,利用linux系统接口inotify来监听该目录新增文件。

    inotify_fd = inotify_init();
    inotify_add_watch(inotify_fd, path.c_str(), IN_CREATE | IN_MODIFY | IN_DELETE) // 根据需要添加要监听的事件

    然后,通过epoll监听

    // 创建epoll句柄
    int epfd = epoll_create(256);
    struct epoll_event ev;
    ev.data.fd = inotify_fd;        
    ev.events = EPOLLIN | EPOLLET;
    // 注册 epoll 事件
    LOGD("epoll_ctl");
    epoll_ctl(epfd, EPOLL_CTL_ADD, inotify_fd, &ev);

    // 循环监听事件
        char buffer[BUF_LEN];
        struct epoll_event events[20];  // 存储从内核得到的事件集合
        while (!isStopped) {
            LOGD("epoll wait");
            // 等待事件发生。返回需要处理的事件数目
            int nfds = epoll_wait(epfd, events, 20, 500);
            LOGD("Event count: %d", nfds);
            sleep(3); 

            // 遍历events

            。。。

        }

    测试时,发现在监听过程中,点击读取文件内容,出现ANR,最后发现整个监听需要放到子线程完成

    work_thread = new std::thread([this, path] { startWatchImpl(path.c_str()); });
    记得释放申请的内存和各种句柄
    close(epfd);
    close(inotify_fd);
  • 相关阅读:
    git使用整理
    数据中台为什么不好搞?
    GDB调试技巧汇总
    数仓之数据质量及Apache Griffin简介
    云主机修复监控插件异常的方法
    [附源码]java毕业设计网上手机商城
    劲松中西医医院谭巍主任在线分析:HPV复阳的三大祸首
    buuctf-misc-wireshark1
    linux vim编辑器
    HTML标签 label for 还是 htmlFor
  • 原文地址:https://blog.csdn.net/nadiee/article/details/133806206