【API】获取当前进程的内存信息
发布时间:2023-05-16 14:22:19
获取当前进程的内存信息是一个非常常见的操作,在操作系统中也提供了相应的API来实现此功能,不同的系统下可能会有所不同,下面分别介绍Windows和Linux下的API实现。
一、Windows
在Windows下,可以利用GetProcessMemoryInfo API函数来获取当前进程的内存信息。具体的实现过程如下:
1. 引入头文件
#include <windows.h>
2. 定义进程句柄和PROCESS_MEMORY_COUNTERS_EX类型变量
HANDLE hProcess; PROCESS_MEMORY_COUNTERS_EX pmc;
3. 获取当前进程句柄
hProcess = GetCurrentProcess();
4. 调用API函数
GetProcessMemoryInfo(hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
5. 最终结果
pmc.WorkingSetSize; pmc.PrivateUsage; pmc.PagefileUsage; pmc.PeakWorkingSetSize; pmc.PeakPagefileUsage; pmc.QuotaNonPagedPoolUsage; pmc.QuotaPagedPoolUsage; pmc.QuotaPeakNonPagedPoolUsage; pmc.QuotaPeakPagedPoolUsage;
其中,WorkingSetSize表示当前进程所使用的物理内存大小,PrivateUsage表示当前进程所使用的私有内存大小,PagefileUsage表示当前进程所使用的虚拟内存大小。
二、Linux
在Linux下,可以利用/proc/self/status文件来获取当前进程的内存信息。具体的实现过程如下:
1. 定义文件指针和缓冲区
FILE* fp; char buf[1024];
2. 打开/proc/self/status文件
fp = fopen("/proc/self/status", "r");
3. 循环读取文件内容
while (fgets(buf, sizeof(buf), fp)) {
if (strncmp(buf, "VmPeak:", 7) == 0) {
//do something
}
if (strncmp(buf, "VmSize:", 7) == 0) {
//do something
}
if (strncmp(buf, "VmLck:", 6) == 0) {
//do something
}
if (strncmp(buf, "VmPin:", 6) == 0) {
//do something
}
if (strncmp(buf, "VmHWM:", 6) == 0) {
//do something
}
if (strncmp(buf, "VmRSS:", 6) == 0) {
//do something
}
if (strncmp(buf, "VmData:", 7) == 0) {
//do something
}
if (strncmp(buf, "VmStk:", 6) == 0) {
//do something
}
if (strncmp(buf, "VmExe:", 6) == 0) {
//do something
}
if (strncmp(buf, "VmLib:", 6) == 0) {
//do something
}
if (strncmp(buf, "VmPTE:", 6) == 0) {
//do something
}
}
4. 关闭文件指针
fclose(fp);
其中,不同的标记对应着不同的内存信息,如VmPeak表示当前进程所使用的最大内存大小,VmSize表示当前进程所使用的虚拟内存大小,VmRSS表示当前进程所使用的物理内存大小。
总之,获取当前进程的内存信息是一个非常简单的操作,通过不同的API函数可以在不同的系统下实现。同时,了解当前进程的内存信息也是性能优化和内存管理的必要手段。
