一次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);
相关推荐
昵称为空C2 小时前
SpringBoot接口限流的常用方案
服务器·spring boot
Peter_Deng.2 小时前
Linux 下基于 TCP 的 C 语言客户端/服务器通信详解(三个示例逐步进阶)
服务器·c语言·网络
花小璇学linux2 小时前
imx6ull-驱动开发篇24——Linux 中断API函数
linux·驱动开发·嵌入式软件
林开落L3 小时前
库制作与原理(下)
linux·开发语言·centos·库制作与原理
wxy3193 小时前
嵌入式LINUX——————TCP并发服务器
java·linux·网络
Castamere3 小时前
配置 Linux 终端 (zsh)
linux
杭州泽沃电子科技有限公司4 小时前
告别翻山越岭!智能监拍远程守护输电线路安全
运维·人工智能·科技·安全
小韩博5 小时前
metasploit 框架安装更新遇到无法下载问题如何解决
linux·网络安全·公钥·下载失败
长臂人猿5 小时前
JVM常用工具:jstat、jmap、jstack
linux·运维·jvm
轻松Ai享生活5 小时前
揭秘 linux:一张图看懂系统配置的核心
linux