C++使用pidof判断进程存在性异常:进程存在但返回不存在
C++使用pidof判断进程存在性异常:进程存在但返回不存在
问题描述:
在C++程序中,我使用 pidof 命令来判断某个进程是否存在。然而,我遇到了一个奇怪的问题:程序日志先打印出该进程的资源使用情况,表明进程确实存在,但紧接着就报告该进程不存在。
代码片段:
以下是我用于判断进程是否存在的函数代码:cppbool 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();}
问题分析:
经过分析,我发现问题出在 checkProcessExists 函数对 pidof 命令返回值的处理上。pidof 命令实际上返回的是所有匹配进程名称的进程的 PID,而不是一个简单的布尔值。因此,即使进程存在,result 变量也可能包含多个 PID,导致函数返回错误的结果。
解决方案:
为了解决这个问题,我修改了 checkProcessExists 函数的实现,使用 pidof -s 命令来获取第一个匹配进程的 PID,并根据返回值是否为空来判断进程是否存在:cppbool MONITOR_BASE::checkProcessExists(const std::string &process_name){ std::string check_process_cmd = 'pidof -s ' + 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(); // 反转逻辑,如果结果为空,则表示进程不存在}
总结:
在使用 pidof 命令判断进程存在性时,务必注意其返回值的含义,避免因为误解导致程序逻辑错误。建议使用 pidof -s 命令来获取第一个匹配进程的 PID,并根据返回值是否为空来判断进程是否存在,以确保程序的正确性。
原文地址: https://www.cveoy.top/t/topic/uNW 著作权归作者所有。请勿转载和采集!