C++ 使用 waitpid() 准确判断进程是否存在并更新 cpu_info_
在之前提供的代码中,确实无法准确判断进程是否存在,并且无论进程是否存在,对应的 'cpu_info_' 值都会被赋值为0。
为了解决这个问题,可以使用 'waitpid()' 函数结合 'WIFEXITED' 宏来获取 'pgrep' 命令的执行状态,从而准确判断进程是否存在。
下面是改正后的 'clear_cpu_info_()' 函数的示例代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void MONITOR_BASE::clear_cpu_info_()
{
std::string process_name = "auto_ad_memory_monitor";
std::string check_process_cmd = "pgrep " + process_name;
pid_t pid = fork();
if (pid == -1)
{
// 处理fork()失败的情况
return;
}
else if (pid == 0)
{
// 子进程执行pgrep命令
execlp("pgrep", "pgrep", process_name.c_str(), nullptr);
_exit(1);
}
else
{
// 父进程等待子进程执行完毕
int status;
waitpid(pid, &status, 0);
if (WIFEXITED(status))
{
int exit_status = WEXITSTATUS(status);
if (exit_status != 0)
{
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;
}
}
}
}
在这个修改后的函数中,我们使用 'fork()' 创建一个子进程,子进程负责执行 'pgrep' 命令。父进程则等待子进程执行完毕并获取子进程的退出状态。
通过 'WIFEXITED' 宏判断子进程是否正常退出,如果正常退出,则可以使用 'WEXITSTATUS' 宏获取子进程的退出状态码。如果退出状态码不等于0,表示进程不存在,我们将对应的 'cpu_info_' 值设为0。
这样,函数就可以准确判断进程是否存在,并根据进程存在与否来设置对应的 'cpu_info_' 值。
再次非常抱歉之前给您带来的困扰。希望这个修改后的代码可以正确实现您想要的功能。如果还有其他问题,请随时向我提问。
原文地址: https://www.cveoy.top/t/topic/knE 著作权归作者所有。请勿转载和采集!