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

news/2024/12/13 2:42:45/

目的:监听系统/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);

http://www.ppmy.cn/news/1152420.html

相关文章

C语言【关键字】

C语言中32个关键词的含义和用途 分 类 关键字 含义和用途 基本数据类型 简单数据类型 int 声明整型变量或函数 char 声明字符型变量或函数 float 声明浮点型变量或函数 double 声明双精度变量或函数 特殊类型 register 声明寄存器变量 void 声明函数无返回…

软件测试/测试开发/人工智能丨聊聊AutoGPT那些事儿

点此获取更多相关资料 简介 在 ChatGPT 问世之后,大家很容易就发现其依然具备一些很难解决的问题,比如: Token 超出限制怎么办?(目前最新的 GPT4 支持最多8,192 tokens)。如何完全自动化?任务…

zookeeper应用场景(一)

一、zookeeper客户端api 1、官方Java客户端api 引入zookeeper client依赖 <dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.9.0</version> </dependency> 1&#xff09…

频繁GC问题原因总结

频繁GC 频繁的垃圾回收&#xff08;GC&#xff09;通常是由以下一些原因引起的&#xff1a; 内存分配过多&#xff1a;如果应用程序频繁地分配新的对象而不释放旧的对象&#xff0c;堆内存将快速用满&#xff0c;触发频繁的垃圾回收。这可能是由于代码中存在内存泄漏或不合理…

sql 注入(4), 盲注

sql 注入, 盲注 盲注适合在页面没有任何回显时使用. 测试页面有变化, 但是没有显示任何异常错误等信息. 情景: url: http://192.168.112.200/security/read.php?id1 服务器数据库名: learn一, boolean盲注 # 盲注可能需要一个一个字符去试探, 字符串处理函数经常会用到. 比…

软件测试/测试开发丨Python闭包与装饰器 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27720 闭包与装饰器 1、函数引用 Python 中定义的函数&#xff0c;也可以像变量一样&#xff0c;将一个函数名&#xff0c;赋值给另一个变量名&#xff…

【算法与数据结构】--常见数据结构--栈和队列

一、栈 栈&#xff08;Stack&#xff09; 是一种基本的数据结构&#xff0c;具有后进先出&#xff08;LIFO&#xff09;的特性&#xff0c;类似于现实生活中的一叠盘子。栈用于存储一组元素&#xff0c;但只允许在栈顶进行插入&#xff08;入栈&#xff09;和删除&#xff08;…

开源数据库MySQL 8.0 OCP认证精讲视频、环境和题库 之三 选项、变量

选项文件&#xff1a;默认/etc/my.cnf 可以通过以下选项&#xff0c;指定选项文件&#xff1a; -defaults-file&#xff1a;指定选项文件 例如:mysql--defaults-file/etc/my.cnf -no-defaults&#xff1a;不读任何选项文件&#xff0c;所有选项需要在命令行中指定 -defaults-ex…