2012-11-07 78 views
7

我有下面的代碼創建一個子分叉。我想在孩子完成父母的執行之前殺死孩子。怎麼做?如何殺死叉子?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int i; 

main (int ac, char **av) 
{ 
    int pid; 

    i = 1; 

    if ((pid = fork()) == 0) { 
    /* child */ 
    while (1) { 
     printf ("I m child\n"); 
     sleep (1); 
    } 
    } 
    else { 
    /* Error */ 
    perror ("fork"); 
    exit (1); 
    } 
    sleep (10) 

    // TODO here: how to add code to kill child?? 

} 
+3

'叉()'返回一個'pid_t' ,而不是'int',所以你應該聲明你的變量是這樣的。 –

+1

與原始問題無關:當fork返回一個新進程時(在成功的情況下),父進程和子進程都從調用fork的地方繼續執行。對於父進程,子進程的pid = 0(嗯,它總是可以通過getpid()獲得)並且pid> 0。該錯誤僅在fork返回-1時出現。在你的代碼中,你將一個「父進程」部分視爲一個錯誤。 –

+0

[如何殺死父進程的子進程?](http://stackoverflow.com/questions/6501522/how-to-kill-a-child-process-by-the-parent-process) – goozez

回答

8

發送信號。

#include <sys/types.h> 
#include <signal.h> 

kill(pid, SIGKILL); 

/* or */ 

kill(pid, SIGTERM); 

如果你自己處理信號,第二種形式更可取。

+5

或'SIGTERM',如果你想更有禮貌:) –

+2

爲什麼每個人都堅持SIGKILL? –

+0

@Niklas B .:在這裏使用'SIGTERM'有什麼好處嗎?據我所知,他沒有任何處理人員。 – md5

3

問題kill(pid, SIGKILL)超出父項。

9

請參閱​​系統調用。在使用SIGKILL之前,通常首先使用SIGTERM來讓進程有機會感激地死去。

編輯

忘記你需要使用waitpid來獲取過程的返回狀態,防止殭屍進程。

甲進一步編輯

可以使用以下代碼:

kill(pid, SIGTERM); 

bool died = false; 
for (int loop; !died && loop < 5 /*For example */; ++loop) 
{ 
    int status; 
    pid_t id; 
    sleep(1); 
    if (waitpid(pid, &status, WNOHANG) == pid) died = true; 
} 

if (!died) kill(pid, SIGKILL); 

它會給處理5秒至死擺好