Wie kann man einen untergeordneten Prozess durch den übergeordneten Prozess beenden?

Lesezeit: 2 Minuten

Ich erstelle einen untergeordneten Prozess mit a fork(). Wie kann der übergeordnete Prozess den untergeordneten Prozess beenden, wenn der untergeordnete Prozess seine Ausführung nicht innerhalb von 30 Sekunden abschließen kann? Ich möchte dem untergeordneten Prozess erlauben, bis zu 30 Sekunden auszuführen. Wenn es länger als 30 Sekunden dauert, wird es vom übergeordneten Prozess beendet. Hast du eine Idee, das zu tun?

Mikolas Benutzeravatar
Nikola

Senden Sie ihm ein SIGTERM oder ein SIGKILL:

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

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

SIGTERM ist höflich und lässt den Prozess aufräumen, bevor er geht, während SIGKILL dafür da ist, wenn er nicht zuhört >:)

Beispiel aus der Shell (Manpage: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill )

kill -9 pid

In C können Sie dasselbe mit dem Befehl kill syscall tun:

kill(pid, SIGKILL);

Siehe folgende Manpage: http://linux.die.net/man/2/kill

Abhijits Benutzeravatar
Abhijit

Versuchen Sie so etwas:

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

  • Muss ich den Alarm zurücksetzen (alarm(0)) im übergeordneten Teil, wenn das Kind vor 30 Sekunden ausgeführt wird?

    – miraj

    28. Juni 2011 um 7:17 Uhr

  • @miraj Hallo, hast du die Lösung, um den Alarm zu löschen? Ich habe eine ähnliche Frage, ich schreibe einen Socket-Client/Server, der Server verzweigt einen untergeordneten Prozess, wenn der Socket-Client eine Verbindung herstellt, aber wenn das Kind innerhalb von 1 Minute keine Nachricht sendet, beendet der Server den untergeordneten Prozess. Wenn der Client eine Nachricht an den Server sendet, wird der Timer wieder auf 1 Minute zurückgesetzt.

    – charles.cc.hsu

    23. Oktober 2016 um 9:44 Uhr


Im Elternprozess ist der Rückgabewert von fork() die Prozess-ID des Kindprozesses. Stecken Sie diesen Wert irgendwo weg, wenn Sie den untergeordneten Prozess beenden müssen. fork() gibt null(0) im untergeordneten Prozess zurück.

Wenn Sie den untergeordneten Prozess beenden müssen, verwenden Sie die Funktion kill(2) mit der Prozess-ID, die von fork() zurückgegeben wird, und dem Signal, das Sie liefern möchten (z. B. SIGTERM).

Denken Sie daran, wait() für den untergeordneten Prozess aufzurufen, um verweilende Zombies zu verhindern.

1396910cookie-checkWie kann man einen untergeordneten Prozess durch den übergeordneten Prozess beenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy