Linux如何获取进程在物理内存中的所有内容?当进程在内存中的内容发生变化时,又如何获知?内核中实现 60
2个回答
展开全部
/proc/meminfo 不能反映每个进程的内存使用
这些东西只在/proc/xxxx/下的statm maps memmap 里有体现
你只需要查看这些虚拟文件在linux内核的实现即可
例如cat /proc/1/statm ,出来的7组数据里,第二组就是进程1的物理内存使用量,单位是当前内核的PAGE_SIZE
具体说明详见 Documentation/filesystems/proc.txt
具体实现就是fs/proc/array.c 下的
C/C++ code?123456789101112131415int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *task){ unsigned long size = 0, resident = 0, shared = 0, text = 0, data = 0; struct mm_struct *mm = get_task_mm(task); if (mm) { size = task_statm(mm, &shared, &text, &data, &resident); mmput(mm); } seq_printf(m, "%lu %lu %lu %lu 0 %lu 0\n", size, resident, shared, text, data); return 0;}
这个函数改成你需要的结果,只有一个难点,就是根据pid得到对应的 task_struct。
不知道有没现成的api。遍历查找一下全局 task_struct链表应该不难解决
这些东西只在/proc/xxxx/下的statm maps memmap 里有体现
你只需要查看这些虚拟文件在linux内核的实现即可
例如cat /proc/1/statm ,出来的7组数据里,第二组就是进程1的物理内存使用量,单位是当前内核的PAGE_SIZE
具体说明详见 Documentation/filesystems/proc.txt
具体实现就是fs/proc/array.c 下的
C/C++ code?123456789101112131415int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *task){ unsigned long size = 0, resident = 0, shared = 0, text = 0, data = 0; struct mm_struct *mm = get_task_mm(task); if (mm) { size = task_statm(mm, &shared, &text, &data, &resident); mmput(mm); } seq_printf(m, "%lu %lu %lu %lu 0 %lu 0\n", size, resident, shared, text, data); return 0;}
这个函数改成你需要的结果,只有一个难点,就是根据pid得到对应的 task_struct。
不知道有没现成的api。遍历查找一下全局 task_struct链表应该不难解决
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
快又稳
2024-10-28 广告
2024-10-28 广告
在Linux环境下配置基于域名的虚拟主机,需安装Apache或Nginx等Web服务器,并编辑配置文件。以Apache为例,需创建虚拟主机配置文件,指定域名、文档根目录等,然后启用该配置文件并重启Apache服务。同样,Nginx也需在相应...
点击进入详情页
本回答由快又稳提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询