Wie kann ein Prozess töten sich selbst?
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
int main(){
pid_t pid = fork();
if(pid==0){
system("watch ls");
}
else{
sleep(5);
killpg(getpid(),SIGTERM); //to kill the complete process tree.
}
return 0;
}
Terminal:
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
Terminated
für die ersten 5 Sekunden die Ausgabe des "watch ls" angezeigt und dann abgebrochen, weil ich das senden eines SIGTERM.
Frage: Wie kann ein Prozess selbst tötet ? Ich habe getan, kill(getpid(),SIGTERM);
Meine Hypothese:
also während der kill () - Aufruf, der Prozess wechselt in den kernel mode. Die kill-Aufruf sendet SIGTERM an den Prozess und kopiert Sie in den Prozess-Prozess-Tabelle. wenn der Prozess kommt wieder in den Benutzermodus sieht es das signal in der Tabelle und beendet sich selbst (WIE ? ICH WEIß ES WIRKLICH NICHT )
(Ich glaube, ich werde falsch (möglicherweise ein Fehler) irgendwo in meiner Hypothese ... also Bitte erleuchte mich)
Dieser code ist eigentlich ein stub, die ich benutze, um zu testen, meine anderen Module des Projekts.
Seine Arbeit für mich und ich bin glücklich mit ihm aber es liegt eine Frage in meinem Kopf, wie eigentlich ein Prozess tötet sich selbst. Ich möchte wissen, die Schritt für Schritt-Hypothese.
Vielen Dank im Voraus
Anirudh Tomer
- Warum sollte ein Prozess zu töten sich selbst? Wenn Sie beschließt zu kündigen, wird es nicht gerade nennen
exit()
? - Wie wollen Sie töten, was kein Leben???
- Der Grund wird in dem obigen Fall, wenn u Aufruf exit() anstatt zu töten, dann wird nur die parent-Prozesses getötet wird. Der Kind-Prozess wird zum Waisenkind und init wird seine neuen Eltern-und es hält immer noch läuft.
- Ich will, dass die gesamten Prozess-Baum ist beendet. wenn ich killpg(pid,SIGTERM) klappt es auch nicht für mich, und es tötet nur das Kind wieder "system ()" - Funktion, Prozess läuft weiter. Ich habe versucht zu tun, killpg(getpid(),SIGTERM) und es hat den job für mich. Aber wieder die Frage ist, wie ist das möglich ?
- Vielleicht sollten Sie Bearbeiten Ihre Frage wie tötet man den gesamten Prozess-Baum, denn das scheint das zu sein, was Sie wirklich wollen.
- ah! aber dann die Leute nicht mir Antworten, "wie ist es möglich, dass ein Prozess, der tötet sich selbst mit kill () - Funktion". Ich darf Sie Antwort auf die Frage: "wie tötet man eine komplette Prozess-Baum", indem Sie durch einige Bücher/man-Seiten oder Googlen, aber ich möchte wissen, die Hypothese, die hinter diesem Verhalten von dem code, den ich schrieb
- Es ruft der geheime system call seppuku(2). 😉 Aber wirklich, ich glaube nicht, dass die Kontrolle wieder an den Prozess, wenn Sie nicht das hinzufügen eines SIGTERM-handler mit signal(2).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihren Prozess stirbt, weil Sie mit
killpg()
, dass sendet ein signal an einen Prozess-Gruppe, die nicht zu einem Prozess.Wenn Sie
fork()
die Kinder erbt vom Vater, unter den anderen Dinge, die Prozess-Gruppe. Vonman fork
:So, Sie töten die Eltern zusammen mit dem Kind.
Wenn Sie eine einfache
kill(getpid(), SIGTERM)
dann den Vater töten wird, das Kind (das istwatch
ingls
) und dann wird friedlich beenden.killpg
durchkill
und Sie werden sehen, nach 5 Sek. stirbt der Elternteil und das Kind, erbt der init-Prozess. Tun ps -a zu diesem Zeitpunkt. Auch eine andere Sache, die ich Tue, falsch istkillpg(getpid(),SIGTERM);
aber da die pgid pid des parent-Prozesses ist die gleiche, es funktioniert hier. Auch der Kind-Prozess hat die gleiche pgid. es solltekillpg(getpgid(getpid()),SIGTERM);
wenn BASH Gabeln und Produzenten für ein Kind-Prozess, es ändert sichpgid
und macht gleich seinepid
so, dass selbst wenn das Kind killpg bash sicher bleibt.In Linux, bei der Rückkehr aus dem kernel-Modus in den user-space-Modus den kernel überprüft, ob es irgendwelche ausstehenden Signale geliefert werden kann. Wenn es Sie gibt, liefert die Signale kurz vor der Rückkehr in den user-space-Modus. Es kann auch liefern Signale, die zu anderen Zeiten, zum Beispiel, wenn ein Prozess blockiert wurde, auf
select()
und dann getötet, oder wenn ein thread greift auf eine nicht zugeordnete Speicher.Ich denke, dass es, wenn es sieht das SIGTERM-signal in seiner Prozess-Tabellen es erste tötet seine Kind-Prozesse( kompletten Baum, da habe ich angerufen killpg() ) und ruft dann mit exit().
Ich bin noch auf der Suche nach einer besseren Antwort auf diese Frage.
Getestet habe ich es nach einer
fork
mit case 0: und damit beenden regelmäßige aus separaten übergeordneten Prozess.Ich weiß nicht, ob dies ist ein standard-Zertifizierung Methode ....
(Ich sehe von meinem psensor-tool, dass die CPU-Auslastung Rückkehr in 34% wie ein normales Programm-code mit
ein Zähler gestoppt ) .
Dies ist super-easy in Perl:
Umrechnung in C ist Links als übung für den Leser.