2012-09-26 53 views
5

我想在我的程序中知道是否存在具有某個ID的進程。我實現了以下功能來實現該功能,它檢查是否存在/proc/<PID>/maps。然而,我注意到,即使我殺死了一個給定ID的函數,這個函數仍然返回1.是否有更好的方法來實現我想要做的事情,如果沒有,這個代碼有什麼問題,如果有的話,爲什麼是將其返回1,當它應該返回0。確定進程ID是否存在進程

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

你是否在等待發出殺死並檢查它已退出?如果你做'ps -ef |會發生什麼grep _PID_'? –

+0

雅我在一個循環中調用proc_exists,等待進程被殺死。現在我用ps -ef |查看grep,它表示defunt功能。什麼是defunt功能? – pythonic

+0

這意味着該過程不再運行;但是,它並沒有通過調用wait()或waitpid()來清除。它仍然是信號的有效目標,並且在進程表中仍然有一個條目。 –

回答

8

使用kill()與信號0

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

man kill

如果SIG是0時,則n o信號被髮送,但仍然執行錯誤檢查;這可以用來檢查是否存在進程ID或進程組ID。

+0

不要忘記,PID是回收利用。一個堅定的攻擊者可以通過一些快速的叉子來遍歷所有的PID,並且讓他們自己的進程擁有與你正在尋找的相同的PID。 –

+0

看起來不起作用。 – pythonic

+0

@ user1018562,'kill()'返回什麼,'errno'的值是什麼? – hmjd

5

爲了克服過程中存在的殭屍的可能性,我用了以下內容:

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

這對我的作品!

相關問題