2012-11-07 7 views
7

Çocuk çatalı oluşturacak aşağıdaki kodum var. Ve çocuğu ebeveyninde infazını bitirmeden önce öldürmek istiyorum. nasıl yapılır?Çocuğun çatalını nasıl öldürebilirim?

#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

fork() 'a pid_t' döner ölmek

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

Bu sürecini 5 saniye verecek bir int değil, bu yüzden değişkeni böyle beyan etmelisin. –

+1

Özgün soruyla ilgisiz: Çatal döndüğünde yeni bir süreç ortaya çıkar (başarı durumunda) ve hem ebeveyn hem de çocuk “fork” çağrısının yapıldığı yerden devam eder. Bir çocuk işlemi için pid = 0 (iyi, her zaman getpid() ile elde edebilir ve bir ana işlem için pid> 0 olabilir. Hata sadece çatal -1 döndürür. Kodunuzda bir "ana işlem" parçasını bir hata olarak ele alıyorsunuz. –

+0

olası bir kopyası [Ebeveyn süreci tarafından nasıl bir alt süreç başlatılır?] (Http://stackoverflow.com/questions/6501522/how-to-kill-a-child-process-by-the-parent-process) – goozez

cevap

8

Sinyal gönder.

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

kill(pid, SIGKILL); 

/* or */ 

kill(pid, SIGTERM); 

İkinci form, diğerlerinin yanında, kendi başına sinyalleri ele alırsanız tercih edilir.

+5

veya 'SIGTERM', daha nazik olmak istiyorsanız :) –

+2

Neden herkes SIGKILL'lerde ısrar ediyor? –

+0

@Niklas B .: Burada "SIGTERM" kullanmak için bir avantaj var mı? Görebildiğim kadarıyla hiçbir işleyicisi yok. – md5

3

ebeveynden dışından Sayı kill(pid, SIGKILL).

9

Bkz. kill sistem çağrısı. SIGKILL'i kullanmadan önce prosese minnettarlıkla ölme fırsatı vermek için öncelikle SIGTERM'i kullanmak iyi bir fikirdir.

DÜZENLEME o sürecin dönüş durumunu almak ve zombi süreçleri engellemek için waitpid kullanmak gerekir unuttum.

AYRICA DÜZENLEME

Aşağıdaki kodu kullanabilir: incelikle