C++ 检查进程是否存在函数 - checkProcessExists 代码分析
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();
}
逐行解释
-
std::string check_process_cmd = 'pidof ' + process_name;- 创建一个
std::string类型变量check_process_cmd,用于存储执行的命令。在这里,将进程名称与字符串 'pidof ' 进行拼接,构建用于获取进程 PID 的命令。
- 创建一个
-
FILE *pipe = popen(check_process_cmd.c_str(), 'r');- 使用
popen函数以只读模式打开一个管道,并执行check_process_cmd命令。该命令会获取与给定进程名称匹配的进程的 PID。
- 使用
-
char buffer[128];- 创建一个字符数组
buffer,用于存储读取管道输出的数据。
- 创建一个字符数组
-
std::string result = '';- 创建一个空的
std::string类型变量result,用于存储从管道读取的输出结果。
- 创建一个空的
-
while (fgets(buffer, sizeof(buffer), pipe) != nullptr)- 使用
fgets函数循环读取管道中的输出,每次读取一行,并将其存储在buffer中。循环会一直执行,直到fgets返回nullptr,即读取到管道末尾。
- 使用
-
result += buffer;- 将当前读取到的行数据(存储在
buffer中)追加到result字符串末尾。
- 将当前读取到的行数据(存储在
-
pclose(pipe);- 使用
pclose函数关闭管道,释放相应的资源。
- 使用
-
return !result.empty();- 返回一个布尔值,表示进程是否存在。如果
result字符串不为空,则表示进程存在,返回true;否则,表示进程不存在,返回false。
- 返回一个布尔值,表示进程是否存在。如果
代码分析
该函数通过执行系统命令 'pidof' 获取与给定进程名称匹配的进程的 PID。如果输出结果不为空,则表示进程存在,否则表示进程不存在。
优化建议
- 可以使用
std::stringstream代替std::string来拼接命令,提高代码可读性。 - 可以使用
std::getline代替fgets来读取管道输出,避免缓冲区溢出风险。 - 可以使用
boost::process或systemd-nspawn等库来更方便地执行命令和管理进程。
注意
- 该函数使用了 C 语言库中的函数
popen、fgets和pclose,用于执行命令和处理管道。在使用这些函数时,请确保在编译时包含了相关的头文件,并且在运行环境中可以执行相应的系统命令。 - 'pidof' 命令可能在某些系统中不可用,需要根据实际情况进行调整。
总结
该代码示例展示了如何使用 C++ 代码检查进程是否存在,并提供了优化建议。在实际应用中,需要根据具体需求选择合适的方案和库进行开发。
原文地址: https://www.cveoy.top/t/topic/ux1 著作权归作者所有。请勿转载和采集!