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?
Wie kann man einen untergeordneten Prozess durch den übergeordneten Prozess beenden?
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
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.