2012-11-07 14 views
7

Mam następujący kod, który tworzy widelec dziecka. I chcę zabić dziecko przed zakończeniem jego realizacji w rodzicu. jak to zrobić?jak zabić dziecko widelca?

#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

'widelec()' zwraca 'pid_t' , a nie 'int', więc powinieneś zadeklarować swoją zmienną jako taką. –

+1

Niezwiązane z pierwotnym pytaniem: Kiedy fork zwróci nowy proces zostanie utworzony (w przypadku powodzenia) i zarówno rodzic, jak i dziecko kontynuują wykonywanie od miejsca, w którym zostało wywołane 'fork'. pid = 0 dla procesu potomnego (cóż, zawsze można go uzyskać przez getpid()) i pid> 0 dla procesu nadrzędnego. Błąd występuje tylko wtedy, gdy fork zwraca wartość -1. W twoim kodzie traktujesz część "proces nadrzędny" jako błąd. –

+0

możliwy duplikat [Jak zabić proces potomny przez proces nadrzędny?] (Http://stackoverflow.com/questions/6501522/how-to-kill-a-child-process-by-the-parent-process) – goozez

Odpowiedz

8

Wysyła sygnał.

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

kill(pid, SIGKILL); 

/* or */ 

kill(pid, SIGTERM); 

Druga forma jest lepsza, między innymi, jeśli będziesz obsługiwać sygnały samodzielnie.

+5

lub 'SIGTERM', jeśli chcesz być bardziej grzeczny :) –

+2

Dlaczego wszyscy nalegają na SIGKILL? –

+0

@Niklas B .: Czy jest jakaś korzyść z używania 'SIGTERM' tutaj? O ile widzę, nie ma żadnego przewodnika. – md5

3

Wydanie kill(pid, SIGKILL) z poza rodzica.

9

Zobacz wywołanie systemowe systemu kill. Zwykle dobrym pomysłem jest użycie SIGTERM jako pierwszego, aby dać procesowi szansę na umrzeć z wdzięcznością przed użyciem SIGKILL.

EDIT

Zapomniałeś trzeba użyć waitpid aby uzyskać jego status powrotny tego procesu i uniknąć procesów zombie.

dalszym EDIT

można wykorzystywać następujące kod:

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

To da Proces 5 sekund śmierć bezpiecznie