6

我想在我的程序中知道是否存在具有特定 ID 的进程。我实现了以下功能来实现这一点,它检查是否/proc/<PID>/maps存在。但是,我注意到即使我用给定的 ID 杀死一个函数,这个函数仍然返回 1。有没有更好的方法来实现我想要做的事情,如果没有,这个代码有什么问题,为什么它应该返回 0 时返回 1。

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;
}
4

2 回答 2

10

kill()与信号一起使用0

if (0 == kill(pid, 0))
{
    // Process exists.
}

来自man kill

如果 sig 为 0,则不发送信号,但仍进行错误检查;这可用于检查进程 ID 或进程组 ID 是否存在。

于 2012-09-26T12:33:08.237 回答
7

为了克服进程作为僵尸存在的可能性,我使用了以下内容:

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;
}

这个对我有用!

于 2013-11-27T11:03:42.803 回答