欢迎访问宙启技术站
智能推送

【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函数可以在不同的系统下实现。同时,了解当前进程的内存信息也是性能优化和内存管理的必要手段。