我想在我的程序中知道是否存在具有某个ID的进程。 我实现了以下函数来实现,它检查/proc/<PID>/maps
存在。 然而,我注意到,即使我杀了一个给定的ID的函数,这个函数仍然返回1.是否有任何更好的方法来实现我想要做的事情,如果没有什么是这个代码的问题,如果有的话,为什么它是否返回1,当它应该返回0。
int proc_exists(pid_t pid) { stringstream ss (stringstream::out); ss << dec << pid; string path = "/proc/" + ss.str() + "/maps"; ifstream fp( path.c_str() ); if ( !fp ) return 0; return 1; }
使用kill()
与信号0
:
if (0 == kill(pid, 0)) { // Process exists. }
从man kill
:
如果sig为0,则不发送信号,但仍然执行错误检查。 这可以用来检查是否存在进程ID或进程组ID。
为了克服作为僵尸存在的过程的可能性,我使用了以下内容:
bool is_pid_running(pid_t pid) { while(waitpid(-1, 0, WNOHANG) > 0) { // Wait for defunct.... } if (0 == kill(pid, 0)) return 1; // Process exists return 0; }
这个对我有用!