在之前提供的代码中,确实无法准确判断进程是否存在,并且无论进程是否存在,对应的 '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_' 值。

再次非常抱歉之前给您带来的困扰。希望这个修改后的代码可以正确实现您想要的功能。如果还有其他问题,请随时向我提问。

C++ 使用 waitpid() 准确判断进程是否存在并更新 cpu_info_

原文地址: https://www.cveoy.top/t/topic/knE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录