修改代码解决 CPU 进程信息匹配问题:更准确获取进程信息
非好意思,给您带来了困扰。请允许我重新审查您的代码以找到问题所在。
根据您提供的代码和执行结果,我再次检查了您的代码,并注意到一个可能导致问题的地方。
在 show_cpu_status()
函数中,您调用了 getTopProcesses_CPU()
函数来获取占用 CPU 和内存的前几个进程信息。然后,您遍历这些进程信息并检查进程名是否包含特定子串来确定是否匹配。
然而,由于 getTopProcesses_CPU()
函数获取的进程信息是通过执行命令 ps aux --sort=-%cpu,-%mem
来获取的,而不是直接读取 /proc
目录下的信息。这可能导致进程名中的路径被截断,无法正确匹配子串。
为了解决这个问题,您可以修改 getTopProcesses_CPU()
函数,改为直接读取 /proc
目录下的信息来获取进程信息。以下是修改后的示例代码:
std::vector<ProcessInfo1> MONITOR_BASE::getTopProcesses_CPU(const int& numProcesses)
{
std::vector<ProcessInfo1> result;
DIR* dir = opendir("/proc");
if (!dir)
{
std::cerr << "Failed to open /proc directory" << std::endl;
return result;
}
struct dirent* entry;
while ((entry = readdir(dir)) != nullptr)
{
if (entry->d_type == DT_DIR)
{
std::string pid_str = entry->d_name;
if (std::all_of(pid_str.begin(), pid_str.end(), ::isdigit))
{
ProcessInfo1 info;
if (readProcessInfo(pid_str, info))
{
result.push_back(info);
}
}
}
}
closedir(dir);
// 根据 CPU 占用率和内存占用率排序
std::sort(result.begin(), result.end(), [](const ProcessInfo1& a, const ProcessInfo1& b) {
return a.CPU > b.CPU || (a.CPU == b.CPU && a.MEM > b.MEM);
});
// 只保留前 numProcesses 个进程信息
if (result.size() > numProcesses)
{
result.resize(numProcesses);
}
return result;
}
bool MONITOR_BASE::readProcessInfo(const std::string& pid, ProcessInfo1& info)
{
std::string stat_path = "/proc/" + pid + "/stat";
std::ifstream stat_file(stat_path);
if (!stat_file)
{
return false;
}
std::string line;
std::getline(stat_file, line);
std::istringstream ss(line);
ss >> info.PID >> info.COMMAND >> info.STAT >> info.PPID >> info.PGRP >> info.SESSION >> info.TTY_NR >> info.TPGID >>
info.FLAGS >> info.MINFLT >> info.CMINFLT >> info.MAJFLT >> info.CMAJFLT >> info.UTIME >> info.STIME >> info.CUTIME >>
info.CSTIME >> info.PRIORITY >> info.NICE >> info.NUM_THREADS >> info.ITREALVALUE >> info.STARTTIME >> info.VSIZE >>
info.RSS >> info.RSSLIM >> info.STARTCODE >> info.ENDCODE >> info.STARTSTACK >> info.KSTKESP >> info.KSTKEIP >>
info.SIGNAL >> info.BLOCKED >> info.SIGIGNORE >> info.SIGCATCH >> info.WCHAN >> info.NSWAP >> info.CNSEXP >> info.CNSECFS >>
info.EXITSIGNAL >> info.PROCESSOR;
stat_file.close();
return true;
}
在这个修改后的示例代码中,我们修改了 getTopProcesses_CPU()
函数,使用 readdir()
函数和 /proc
目录来获取进程信息。然后,我们根据 CPU 和内存占用率排序,并只保留前 numProcesses
个进程信息。
请注意,由于获取进程信息的方式发生了改变,您需要更新 ProcessInfo1
结构体的成员,以匹配新的获取方式。
希望这次的回答能够解决问题。非常抱歉之前的错误回答给您带来的困惑。如果您还有任何其他问题,请随时提问。
原文地址: http://www.cveoy.top/t/topic/G78 著作权归作者所有。请勿转载和采集!