linux
#include <iostream>
#include <fstream>
#include <sstream>
#include <unistd.h>class ProcessCPUMonitor {
public:double getProcessCPUUsage() const {// 获取进程启动时间long startTime = getProcessStartTime();// 获取进程的 CPU 时间long utime, stime;if (getProcessCPUUsage(utime, stime)) {// 获取时钟滴答数的分辨率long clockTicks = sysconf(_SC_CLK_TCK);// 计算进程运行时间(秒)long currentTime = getCurrentTime();long elapsedTime = currentTime - startTime;// 计算 CPU 使用率double cpuUsage = 100.0 * ((utime + stime) / static_cast<double>(clockTicks * elapsedTime));return cpuUsage;} else {std::cerr << "Failed to get process CPU information.\n";return -1.0;}}private:// 获取进程启动时间long getProcessStartTime() const {std::ifstream statFile("/proc/self/stat");if (!statFile.is_open()) {std::cerr << "Failed to open /proc/self/stat file.\n";return -1;}std::string line;std::getline(statFile, line);std::istringstream iss(line);// Skip to the start time field (22nd field)for (int i = 0; i < 21; ++i) {iss.ignore();}long startTime;iss >> startTime;return startTime;}// 获取进程的 CPU 时间(utime和stime)bool getProcessCPUUsage(long& utime, long& stime) const {std::ifstream statFile("/proc/self/stat");if (!statFile.is_open()) {std::cerr << "Failed to open /proc/self/stat file.\n";return false;}std::string line;std::getline(statFile, line);std::istringstream iss(line);// Skip to the utime field (14th field)for (int i = 0; i < 13; ++i) {iss.ignore();}iss >> utime;// Skip to the stime field (15th field)for (int i = 0; i < 1; ++i) {iss.ignore();}iss >> stime;return true;}// 获取当前时间(时钟滴答数)long getCurrentTime() const {return sysconf(_SC_CLK_TCK);}
};int main() {ProcessCPUMonitor monitor;// Example: Print process CPU usage every 1 secondfor (int i = 0; i < 5; ++i) {sleep(1);std::cout << "Process CPU Usage: " << monitor.getProcessCPUUsage() << "%\n";}return 0;
}
windows
#include <iostream>
#include <windows.h>class ProcessCPUMonitor {
public:double getProcessCPUUsage() const {FILETIME createTime, exitTime, kernelTime, userTime;if (GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime)) {// 转换 FILETIME 结构到 64 位整数ULARGE_INTEGER kernel, user;kernel.LowPart = kernelTime.dwLowDateTime;kernel.HighPart = kernelTime.dwHighDateTime;user.LowPart = userTime.dwLowDateTime;user.HighPart = userTime.dwHighDateTime;// 计算 CPU 使用率double cpuUsage = 100.0 * (static_cast<double>(kernel.QuadPart + user.QuadPart) / getElapsedTime());return cpuUsage;} else {std::cerr << "Failed to get process CPU information.\n";return -1.0;}}private:// 获取进程启动时间long long getProcessStartTime() const {FILETIME createTime, exitTime, kernelTime, userTime;if (GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime)) {// 转换 FILETIME 结构到 64 位整数ULARGE_INTEGER createTime64;createTime64.LowPart = createTime.dwLowDateTime;createTime64.HighPart = createTime.dwHighDateTime;return createTime64.QuadPart;}return -1;}// 获取当前时间(100纳秒为单位)long long getCurrentTime() const {FILETIME currentTime;GetSystemTimeAsFileTime(¤tTime);// 转换 FILETIME 结构到 64 位整数ULARGE_INTEGER currentTime64;currentTime64.LowPart = currentTime.dwLowDateTime;currentTime64.HighPart = currentTime.dwHighDateTime;return currentTime64.QuadPart;}// 获取经过的时间(秒为单位)double getElapsedTime() const {long long startTime = getProcessStartTime();long long currentTime = getCurrentTime();if (startTime != -1) {return static_cast<double>(currentTime - startTime) / 10000000.0; // 转换为秒}return -1.0;}
};int main() {ProcessCPUMonitor monitor;// Example: Print process CPU usage every 1 secondfor (int i = 0; i < 5; ++i) {Sleep(1000);std::cout << "Process CPU Usage: " << monitor.getProcessCPUUsage() << "%\n";}return 0;
}