C++ 检查进程是否存在函数 - checkProcessExists 代码分析

bool MONITOR_BASE::checkProcessExists(const std::string &process_name)
{
    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);

    return !result.empty();
}

逐行解释

  1. std::string check_process_cmd = 'pidof ' + process_name;

    • 创建一个 std::string 类型变量 check_process_cmd,用于存储执行的命令。在这里,将进程名称与字符串 'pidof ' 进行拼接,构建用于获取进程 PID 的命令。
  2. FILE *pipe = popen(check_process_cmd.c_str(), 'r');

    • 使用 popen 函数以只读模式打开一个管道,并执行 check_process_cmd 命令。该命令会获取与给定进程名称匹配的进程的 PID。
  3. char buffer[128];

    • 创建一个字符数组 buffer,用于存储读取管道输出的数据。
  4. std::string result = '';

    • 创建一个空的 std::string 类型变量 result,用于存储从管道读取的输出结果。
  5. while (fgets(buffer, sizeof(buffer), pipe) != nullptr)

    • 使用 fgets 函数循环读取管道中的输出,每次读取一行,并将其存储在 buffer 中。循环会一直执行,直到 fgets 返回 nullptr,即读取到管道末尾。
  6. result += buffer;

    • 将当前读取到的行数据(存储在 buffer 中)追加到 result 字符串末尾。
  7. pclose(pipe);

    • 使用 pclose 函数关闭管道,释放相应的资源。
  8. return !result.empty();

    • 返回一个布尔值,表示进程是否存在。如果 result 字符串不为空,则表示进程存在,返回 true;否则,表示进程不存在,返回 false

代码分析

该函数通过执行系统命令 'pidof' 获取与给定进程名称匹配的进程的 PID。如果输出结果不为空,则表示进程存在,否则表示进程不存在。

优化建议

  • 可以使用 std::stringstream 代替 std::string 来拼接命令,提高代码可读性。
  • 可以使用 std::getline 代替 fgets 来读取管道输出,避免缓冲区溢出风险。
  • 可以使用 boost::processsystemd-nspawn 等库来更方便地执行命令和管理进程。

注意

  • 该函数使用了 C 语言库中的函数 popenfgetspclose,用于执行命令和处理管道。在使用这些函数时,请确保在编译时包含了相关的头文件,并且在运行环境中可以执行相应的系统命令。
  • 'pidof' 命令可能在某些系统中不可用,需要根据实际情况进行调整。

总结

该代码示例展示了如何使用 C++ 代码检查进程是否存在,并提供了优化建议。在实际应用中,需要根据具体需求选择合适的方案和库进行开发。

C++ 检查进程是否存在函数 - checkProcessExists 代码分析

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

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