2011-06-28 12 views
18

Tworzę proces potomny za pomocą fork(). W jaki sposób proces nadrzędny może zabić proces potomny, jeśli proces potomny nie może zakończyć jego wykonania w ciągu 30 sekund? Chcę zezwolić procesowi potomnemu na wykonanie do 30 sekund. Jeśli zajmie to więcej niż 30 sekund, proces nadrzędny go zabije. Czy masz jakiś pomysł, aby to zrobić?Jak zabić proces potomny przez proces nadrzędny?

Odpowiedz

22

Wyślij SIGTERM lub SIGKILL do niego:

http://en.wikipedia.org/wiki/SIGKILL

http://en.wikipedia.org/wiki/SIGTERM

SIGTERM jest uprzejmy i umożliwia proces czyszczenia, zanim przejdzie, natomiast SIGKILL jest wtedy, gdy nie będzie słuchać> :)

przykład z powłoki (strona człowieka: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill)

kill -9 PID

W C, można zrobić to samo przy użyciu syscall zabijać

kill(pid, SIGKILL); 

zobacz następującą stronę Man: http://linux.die.net/man/2/kill

1

W procesie macierzystym, widelec Wartością zwracaną przez() jest identyfikator procesu procesu potomnego. Rzeczy, które wartościują gdzieś, gdy trzeba zakończyć proces potomny. fork() zwraca zero (0) w procesie potomnym.

Gdy trzeba przerwać proces potomny, należy użyć funkcji kill (2) z identyfikatorem procesu zwróconym przez fork() i sygnałem, który ma zostać dostarczony (np. SIGTERM).

Pamiętaj, aby wywołać funkcję wait() w procesie potomnym, aby zapobiec pozostawaniu zombi.

7

Spróbuj czegoś takiego:

#include <signal.h> 

pid_t child_pid = -1 ; //Global 

void kill_child(int sig) 
{ 
    kill(child_pid,SIGKILL); 
} 

int main(int argc, char *argv[]) 
{ 
    signal(SIGALRM,(void (*)(int))kill_child); 
    child_pid = fork(); 
    if (child_pid > 0) { 
    /*PARENT*/ 
     alarm(30); 
     /* 
     * Do parent's tasks here. 
     */ 
     wait(NULL); 
    } 
    else if (child_pid == 0){ 
    /*CHILD*/ 
     /* 
     * Do child's tasks here. 
     */ 
    } 
} 
+0

Czy muszę zresetować alarm ('alarm (0)') w ramach nadrzędnej, jeśli dziecko wykonuje przed upływem 30 sekund? – miraj

+0

@miraj Witam, czy masz rozwiązanie, aby anulować alarm? Mam podobne pytanie, piszę klienta/serwer gniazda, serwer rozwidla proces potomny, gdy klient gniazda prosi o połączenie, ale jeśli dziecko nie wyśle ​​żadnej wiadomości w ciągu 1 minuty, serwer zabije proces potomny. Jeśli klient wyśle ​​wiadomość na serwer, licznik zostanie ponownie ustawiony na 1 minutę. –