如何监控windows进程的句柄、内存和cpu(三)

本文介绍如何使用Windows API函数GetProcessHandleCount和GetProcessMemoryInfo来监控进程的句柄数和内存占用,通过具体代码示例展示了如何获取指定进程的句柄数量和内存使用情况,对于系统监控和性能分析具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

紧接上文,接下来就是获取进程的句柄数,句柄就是windows进程中各种对象的标识,一般应用程序会通过句柄来执行各种操作,通过监控设备的句柄,我们可以大致判断出进程是否存在异常,比如句柄泄漏,会导致系统卡顿,死机。 看需要用到系统API函数:

GetProcessHandleCount函数:

BOOL GetProcessHandleCount(
    HANDLE hProcess,
    PDWORD pdwHandleCount
); 

函数说明:检索指定进程的打开句柄的数量

参数:hProcess:指定进程的句柄

pdwHandleCount:返回进程的句柄数

返回值:函数成功返回非0,失败返回0.

详见:https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesshandlecount

实现代码如下:

DWORD getProcessHandleCount(LPCWSTR processName)
{
    DWORD dwHandleCount;
    DWORD dwHandleCountAll = 0;
    std::vector<HANDLE> processHandleGroup = GetProcessHandle(processName);
    printf("vector size is %d.\n",processHandleGroup.size());
    if(0 == processHandleGroup.size())
    {
        return -2;
    }
    std::vector<HANDLE>::iterator it;
    for(it=processHandleGroup.begin();it!=processHandleGroup.end();it++)
    {
        GetProcessHandleCount(*it, &dwHandleCount);
        CloseHandle(*it);
        dwHandleCountAll += dwHandleCount;  
        printf ("Current Process Handle count : %d\n", dwHandleCount);
    }
    return dwHandleCountAll;
}

最后就是获取进程占用的内存信息,windows直接提供了API函数:

GetProcessMemoryInfo函数: 
    BOOL GetProcessMemoryInfo( 
    HANDLE Process, 
    PPROCESS_MEMORY_COUNTERS ppsmemCounters, 
    DWORD cb 
); 

函数功能:检索指定进程的内存使用情况

参数:Process:指定进程的句柄,句柄需要以PROCESS_QUERY_INFORMATION或PROCESS_QUERY_LIMITED_INFORMATION访问权限以及PROCESS_VM_READ访问权限打开。

ppsmemCounters:返回内存使用情况,PROCESS_MEMORY_COUNTERS结构体

cb:指向PROCESS_MEMORY_COUNTERS结构的大小

返回值:成功返回非0,失败返回0

详见:https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessmemoryinfo

简单看下PROCESS_MEMORY_COUNTERS结构体:

typedef struct _PROCESS_MEMORY_COUNTERS {
    DWORD cb; //结构大小 
    DWORD PageFaultCount; // 
    SIZE_T PeakWorkingSetSize; //峰值内存使用大小 
    SIZE_T WorkingSetSize; //当前内存使用大小 
    SIZE_T QuotaPeakPagedPoolUsage; // 
    SIZE_T QuotaPagedPoolUsage; // 
    SIZE_T QuotaPeakNonPagedPoolUsage; // 
    SIZE_T QuotaNonPagedPoolUsage; // 
    SIZE_T PagefileUsage; // 
    SIZE_T PeakPagefileUsage; // 
} PROCESS_MEMORY_COUNTERS; 

实现代码如下:

/* *获取进程所占内存大小,同名进程叠加计算 */ 
DWORD getProcessMemorySize(LPCWSTR processName) { 
    DWORD dwMemorySize = 0; 
    PROCESS_MEMORY_COUNTERS pmc; 
    std::vector<HANDLE> processHandleGroup = GetProcessHandle(processName); 
    printf("vector size is %d.\n",processHandleGroup.size()); 
    if(0 == processHandleGroup.size()) {
        return -2; 
    } 
    pmc.cb = sizeof(PROCESS_MEMORY_COUNTERS); 
    std::vector<HANDLE>::iterator it;                  
    for(it=processHandleGroup.begin();it!=processHandleGroup.end();it++){                 
        GetProcessMemoryInfo(*it,&pmc,sizeof(pmc)); 
        CloseHandle(*it); 
        dwMemorySize += pmc.WorkingSetSize/(1024*1024); 
        printf("Current Process Memory : %d MB\n",pmc.WorkingSetSize/(1024*1024)); 
    } 
    printf("Process Memory sum: %d MB\n",dwMemorySize); 
    return dwMemorySize; 
} 

至此,我们就可以通过调用不通的函数,来获取当前windows系统上的指定进程名的进程CPU占用、句柄数和内存占用大小了。

本文为作者原创,如需转载,请在评论区征得作者同意,原创链接:https://blog.csdn.net/anranjingsi/article/details/106149389

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值