C++ 代码分析:为什么 `cpu_info_` 值会突然变为 0?
这段代码在执行过程中,即使进程 'auto_ad_memory_monitor' 在稳定运行,cpu_info_ 的值会突然变为 0,然后又有值,是由于函数中使用了 system() 函数调用 pgrep 命令的方式来判断进程是否存在。
system() 函数调用操作系统的命令解释器来执行指定的命令,然后等待命令完成并返回。在这种情况下,system() 函数返回的是命令的退出状态码,而不是进程的 ID。
因此,在您的注释代码中,判断进程是否存在的逻辑是错误的。当进程存在时,system() 函数会返回非零值,而不是 0。
为了解决这个问题,我们可以使用 pidof 命令来判断进程是否存在。pidof 命令会返回与指定进程名匹配的进程 ID 列表,如果进程不存在,则不会返回任何内容。这样可以准确判断进程是否存在。
下面是修改后的 clear_cpu_info_() 函数的示例代码:
#include <cstdio>
#include <iostream>
#include <string>
void MONITOR_BASE::clear_cpu_info_()
{
std::string process_name = "auto_ad_memory_monitor";
std::string check_process_cmd = "pidof " + process_name;
FILE *pipe = popen(check_process_cmd.c_str(), "r");
char buffer[128];
std::string result = "";
while (fgets(buffer, sizeof(buffer), pipe) != nullptr)
{
result += buffer;
}
pclose(pipe);
if (result.empty())
{
// 进程不存在,将对应的 cpu_info_ 值清零
cpu_info_.auto_ad_memory_monitor.cpu.data = 0;
cpu_info_.auto_ad_memory_monitor.mem.data = 0;
cpu_info_.auto_ad_memory_monitor.vsz.data = 0;
}
}
在这个修改后的代码中,我们使用 pidof 命令来判断进程是否存在。如果 pidof 命令的输出为空,表示进程不存在,我们将对应的 cpu_info_ 值清零。
希望这个修改后的代码可以解决问题。如果还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/kD1 著作权归作者所有。请勿转载和采集!