Soru Ebeveyn sürecinin bir çocuk sürecini nasıl öldürebilirim?


Kullanarak bir alt işlem oluşturuyorum fork(). Çocuk işlemi 30 saniyede yürütmeyi tamamlayamazsa, ebeveyn süreci çocuk sürecini nasıl öldürebilir? Çocuk işleminin 30 saniyeye kadar çalışmasına izin vermek istiyorum. 30 saniyeden uzun sürerse, ana işlem onu ​​öldürür. Bunu yapmak için bir fikrin var mı?


19
2018-06-28 04:23


Menşei




Cevaplar:


Bir SIGTERM veya bir SIGKILL gönder

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

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

SIGTERM kibar ve sürecin gitmeden önce temizlenmesine izin verirken, SIGKILL dinlemeyeceği zamanlar içindir :)

Kabuktan örnek (man sayfa: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill )

-9 pid öldür

C'de, aynı şeyi kill syscall kullanarak yapabilirsiniz:

kill(pid, SIGKILL);

Aşağıdaki man sayfasına bakın: http://linux.die.net/man/2/kill


23
2018-06-28 04:29





Böyle bir şey deneyin:

#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.
         */
    }
}

7
2018-06-28 04:47



Alarmı sıfırlamam gerekir mi (alarm(0)) Ebeveyn kısmında çocuk 30 saniyeden önce çalışırsa? - miraj
@miraj Merhaba, alarmı iptal etme çözümünüz var mı? Benzer bir sorum var, bir soket istemcisi / sunucu yazdım, sunucu soket istemcinin bağlanmasını istediğinde bir çocuk işlem çatalı, ancak çocuk 1 dakika içinde herhangi bir mesaj göndermezse, sunucu çocuk sürecini öldürecek. İstemci sunucuya mesaj gönderirse, zamanlayıcı tekrar 1 dakikaya resetlenir. - charles.cc.hsu


Ebeveyn işleminde fork () 'ın dönüş değeri, alt sürecin süreç kimliğidir. Çocuk sürecini sonlandırmanız gerektiğinde bir yere değer veren şeyler. fork () çocuk işleminde sıfır (0) döndürür.

Çocuk işlemini sonlandırmanız gerektiğinde, fork () tarafından döndürülen işlem kimliğiyle (2) işlevini ve teslim etmek istediğiniz sinyali (örn. SIGTERM) kullanın.

Kalan zombilerin önüne geçmek için çocuk sürecindeki bekle () öğesini çağırmayı unutmayın.


1
2018-06-28 04:33