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;

}
相关文章
|
8月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
336 10
|
9月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
1078 3
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
2218 14
|
9月前
|
存储 大数据 Unix
Python生成器 vs 迭代器:从内存到代码的深度解析
在Python中,处理大数据或无限序列时,迭代器与生成器可避免内存溢出。迭代器通过`__iter__`和`__next__`手动实现,控制灵活;生成器用`yield`自动实现,代码简洁、内存高效。生成器适合大文件读取、惰性计算等场景,是性能优化的关键工具。
433 2
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
1065 20
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
运维 监控 Ubuntu
【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出
通过设置内存守护进程,可以有效监控和管理系统内存使用情况,防止内存溢出带来的系统崩溃和服务中断。本文介绍了如何在Ubuntu中编写和配置内存守护脚本,并将其设置为systemd服务。通过这种方式,可以在内存使用超过设定阈值时自动采取措施,确保系统稳定运行。
681 4
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
238 4
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
442 5
|
存储 Prometheus 监控
监控堆外内存使用情况
监控堆外内存使用情况
948 4