c++如何利用Windows性能计数器pdh,根据进程pid,读取cpu,内存,磁盘,网络,以及该进程打开的所有文件信息
时间: 2024-05-09 18:15:39 浏览: 429
在Windows下可以使用Performance Data Helper (PDH) API来读取性能计数器信息。以下是使用PDH API获取进程CPU、内存、磁盘、网络和文件信息的基本步骤:
1. 打开性能计数器计算机名称和进程ID的查询:
```
PDH_HQUERY hQuery;
PdhOpenQuery(NULL, 0, &hQuery);
```
2. 添加计算机名称和进程ID的性能计数器计数器:
```
PDH_HCOUNTER hCpuCounter, hMemCounter, hDiskCounter, hNetCounter, hFileCounter;
PdhAddCounter(hQuery, "\\Process(pid)\\% Processor Time", 0, &hCpuCounter);
PdhAddCounter(hQuery, "\\Process(pid)\\Working Set", 0, &hMemCounter);
PdhAddCounter(hQuery, "\\Process(pid)\\IO Data Bytes/sec", 0, &hDiskCounter);
PdhAddCounter(hQuery, "\\Process(pid)\\IO Other Bytes/sec", 0, &hNetCounter);
PdhAddCounter(hQuery, "\\Process(pid)\\Handle Count", 0, &hFileCounter);
```
其中,pid为进程ID。
3. 收集性能计数器数据:
```
PdhCollectQueryData(hQuery);
```
4. 获取性能计数器数据:
```
PDH_FMT_COUNTERVALUE cpuValue, memValue, diskValue, netValue, fileValue;
PdhGetFormattedCounterValue(hCpuCounter, PDH_FMT_DOUBLE, NULL, &cpuValue);
PdhGetFormattedCounterValue(hMemCounter, PDH_FMT_LARGE, NULL, &memValue);
PdhGetFormattedCounterValue(hDiskCounter, PDH_FMT_LARGE, NULL, &diskValue);
PdhGetFormattedCounterValue(hNetCounter, PDH_FMT_LARGE, NULL, &netValue);
PdhGetFormattedCounterValue(hFileCounter, PDH_FMT_LONG, NULL, &fileValue);
```
其中,cpuValue为CPU使用率,memValue为内存使用量,diskValue为磁盘读写速率,netValue为网络读写速率,fileValue为文件句柄数。
5. 关闭查询并释放资源:
```
PdhCloseQuery(hQuery);
```
以上是获取单个进程的性能计数器信息的基本步骤。如果需要获取所有进程的信息,可以使用EnumProcesses函数枚举所有进程的ID,然后对每个进程分别执行上述步骤即可。
阅读全文