紧接上文,接下来就是获取进程的句柄数,句柄就是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
简单看下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