inotify代码实现监控自身进程内存变化
【摘要】 inotify代码实现监控自身进程内存变化
以下代码基于inotify进行内存监控实现
JNIEXPORT jboolean JNICALL Java_com_TeSo_testinotify (JNIEnv *, jobject)
{
LOGD("start work===============");
int ret, len, i;
int pid = getpid();
const int MAXLEN = 2048;
char buf[1024];
char readbuf[MAXLEN] ={0};
char result[256] ={0};
int fd, wd;
fd_set readfds;//定义文件描述符字的集合
char *cur_event_filename = NULL;
fd = inotify_init();//用于创建一个 inotify 实例的系统调用,并返回一个指向该实例的文件描述符
sprintf(buf, "/proc/%d/maps", pid);
LOGD("PId======%s",buf);
wd = inotify_add_watch(fd, buf, IN_ALL_EVENTS);
//增加对文件或者目录的监控,并指定需要监控哪些事件。标志用于控制是否将事件添加到已有的监控中
if (wd >= 0) {
while (1) {
i = 0;
FD_ZERO(&readfds); // 对文件描述符集清空
FD_SET(fd, &readfds); // 将fd加入readfds集合
ret = select(fd + 1, &readfds, 0, 0, 0);//检查套接字是否可读
if (ret == -1) {
break;
}
if (ret) {
len = read(fd, readbuf, MAXLEN);//读取包含一个或者多个事件信息的缓存
while (i < len) {
struct inotify_event *event = (struct inotify_event *) &readbuf[i];
//这里会出现自身扫描的时候访问内存也有数据情况,
if ((event->mask & IN_ACCESS) || (event->mask & IN_OPEN)) {
//int ret = kill(pid, SIGKILL);
LOGD("打开并访问了内存 ======%s",event->name);
// kill(pid, SIGKILL); //强制关闭自身进程
}
//修改器重点修改内存在这块
if( (event->mask & IN_MODIFY))
{
// kill(pid, SIGKILL);
LOGD("修改了了了内存 =======%s",event->name);
}
i += sizeof(struct inotify_event) + event->len;
}
}
}
}
inotify_rm_watch(fd, wd);//从监控列表中移出监控项目
close(fd);
return true;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)