一次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 bufferBUF_LEN;

struct epoll_event events20; // 存储从内核得到的事件集合

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);
相关推荐
AOwhisky15 分钟前
Ceph系列第三期:Ceph 集群核心配置与管理
linux·运维·数据库·笔记·ceph
香气袭人知骤暖16 分钟前
人大金仓(KingbaseES)Docker 容器自动备份方案
运维·docker·容器
天疆说19 分钟前
在 Ubuntu 上安装 NASA GMAT R2026a 轨道设计软件
linux·运维·ubuntu
铅笔小新z28 分钟前
【Linux】线程同步与互斥
linux·服务器
武雄(小星Ai)35 分钟前
Gemini CLI 免费用户6月18日停服,Google Antigravity 2.0 深度解读
运维·人工智能·agent
大熊程序猿1 小时前
MarkItDown Docker安装
运维·docker·容器
AI行业学习1 小时前
CC-Switch 下载、安装windows\macOS \Linux 安装
linux·运维·macos
江南风月1 小时前
WGCLOUD监控系统的Restful Http接口一览
运维·zabbix·运维开发·prometheus
KaMeidebaby1 小时前
卡梅德生物技术快报|基因测序技术在 46,XY 性发育障碍变异筛查中的流程与数据分析
服务器·前端·数据库·人工智能·算法·数据挖掘·数据分析
一拳一个娘娘腔1 小时前
【SRC漏洞挖掘系列】第15期:自动化与AI赋能 —— 打造你的专属“漏洞挖掘机”
运维·人工智能·自动化