C++ 根据进程ID确定进程是否存在

C++ 根据进程ID确定进程是否存在,c++,linux,gcc,C++,Linux,Gcc,我想知道在我的程序中是否存在具有特定ID的进程。我实现了以下函数来实现这一点,它检查/proc//maps是否存在。但是,我注意到,即使我用给定的ID杀死一个函数,这个函数仍然返回1。有没有更好的方法来实现我想做的事情?如果没有,这段代码有什么问题?如果有,为什么它应该返回0,却返回1 int proc_exists(pid_t pid) { stringstream ss (stringstream::out); ss << dec << pid;

我想知道在我的程序中是否存在具有特定ID的进程。我实现了以下函数来实现这一点,它检查
/proc//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;
}
int proc_存在(pid_t pid)
{
stringstream ss(stringstream::out);
ss将
kill()
与信号
0
一起使用:

if (0 == kill(pid, 0))
{
    // Process exists.
}
发件人:

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

这对我很有用!

别忘了PID是可回收的。一个有决心的攻击者可以用一些快速的叉子遍历所有的PID,并使他们自己的进程与您要查找的进程具有相同的PID。@user1018562,
kill()是什么意思
return和
errno
的值是多少?现在我看到我试图杀死的进程没有被完全杀死,但它的状态被设置为defunct。知道什么是defunct函数吗?你在发出kill和检查它是否退出之间等待吗?如果你执行'ps-ef | grep PID',会发生什么?是的,我正在调用proc|u,它存在于一个循环中,等待进程被终止。现在我用ps-ef | grep检查,它说的是defunt函数。什么是defunt函数?它意味着进程不再运行;但是,它没有通过调用
wait()
waitpid()进行清理
。它仍然是信号的有效目标,并且在进程表中仍然有一个条目。请尽量小心使用“进程”和“函数”这两个词。它们的含义不同。