2010-04-07 67 views
5

我想弄清楚什麼是發送SIGCHLD信號的進程的pid,我想在我爲SIGCHLD創建的信號處理程序中執行此操作。我將如何做到這一點?我試圖:確定終止進程的PID

int pid = waitpid(-1, NULL, WNOHANG); 

因爲我想等待產生的任何子進程。

+0

你的方法是正確的,它應該工作。你有什麼問題? – qrdl 2010-04-07 20:08:55

+0

我如何獲得發送SIGCHLD的進程的pid? – Hristo 2010-04-07 20:09:30

+2

'waitpid()'返回終止子的pid,如果你從你的信號處理程序調用它。 – qrdl 2010-04-07 20:14:07

回答

7

如果您使用waitpid()或多或少地如圖所示,您將被告知已死亡的子進程之一的PID - 通常這將是唯一已經死亡的進程,但是如果您遇到亂七八糟的進程,你可能會收到一個信號和許多屍體。因此,使用方法:

void sigchld_handler(int signum) 
{ 
    pid_t pid; 
    int status; 
    while ((pid = waitpid(-1, &status, WNOHANG)) != -1) 
    { 
     unregister_child(pid, status); // Or whatever you need to do with the PID 
    } 
} 

您可以NULL取代&status,如果你不關心孩子的退出狀態。