Re: Abbrechen eines Programms, das in einem Bash Skript gestartet wird.
Alexander Glintschert <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Organization | MicroDiscovery GmbH |
| Message-ID | <[email protected]> |
Hallo Bernard! [email protected] schrieb: > hallo, > die Vorschlag über trap das signal abzufangen ist glaube ich der richtige > Weg. Als Aktion müßte da ein kill des > im Skript aufgerufenen Propgramms stehen. Das Von dem Programm nicht die > PID habe und auch nicht weiß > wie ich sie bekomme ohne das Programm in den Hintergrund zu schicken, bin > ich nicht weitergekommen. > Ich habe jetzt den Aufruf des Programm direkt ohne Skript gemacht und > hinter dem kill() noch ein waitpid() > eingebaut und es funktioniert. Da ich aber sonst auch mit Skripten arbeite > bin ich weiterhin an eine Lösung interessiert. > Insbesondere stellt sich mir die Frage, gibt es eine Möglichkeit ein signal > an child prozesse zu schicken, ohne > deren PID zu kennnen? Mit der Funktion kill() unter Unix kann man ein Signal auch an mehrere Prozesse schicken, die derselben Prozeßgruppe angehören wie der Aufrufer der kill()-Funktion. Dafür übergibt man der Funktion als pid des Prozesses, der das Signal empfangen soll, einfach eine 0. Alternativ kann man die Funktion killpg() verwenden. Dies kann man nutzen, um einen Prozeß und alle seine Kindprozesse zu terminieren. Man muß nur dafür sorgen, daß dieser Prozeß und seine Kindprozesse in einer eigenen Prozeßgruppe sind. Dies erreicht man, wenn der Elternprozeß eine neue Prozeßgruppe definiert, wofür er die Funktion setpgid() verwenden kann. Meines Erachtens müßtest Du also in etwa folgende Vorgehensweise implementieren: 1. Das C++-Programm definiert mit setpgid() eine neue Prozeßgruppe. 2. Das C++-Programm ruft fork() und exec() auf, um das Bash-Script zu starten. Dabei erbt das Bash-Script die neue Prozeßgruppennummer. 3. Das Bash-Script startet weitere Prozesse, die dank fork() auch die neue Prozeßgruppennummer erben (sollten). 4. Das C++-Programm ruft kill() auf, wobei es als PID 0 angibt. Dabei werden nun alle Prozesse mit der neuen Prozeßgruppennummer das gesendete Signal erhalten - in Deinem Fall also SIGKILL. Das sind aufgrund der obigen Konstruktion alle Kindprozesse und deren Kindprozesse, sofern sie nicht wieder eigene Prozeßgruppen erzeugt haben, was ich in der von Dir beschriebenen Konstruktion aber für sehr unwahrscheinlich halte. Ausprobiert habe ich das jetzt nicht, aber nach meinem Verständnis müßte es so funktionieren. Schau aber auf jeden Fall nochmal in die Man-Pages der genannten Funktionen. Grüße, Alex. -- "Mit dem ersten Glied ist die Kette geschmiedet. Wenn die erste Rede zensiert, der erste Gedanke verboten, die erste Freiheit verweigert wird, sind wir alle unwiderruflich gefesselt." (Cpt. Picard, ST:TNG) --------------------------------------------------------------------- Alexander Glintschert Das andere Berlin Email: [email protected] Email: [email protected] WWW: http://www.glintschert.de WWW: http://www.anderes-berlin.de Das andere Berlin - Was nicht jeder Reiseführer weiß - und mancher Berliner auch nicht. -- Um die Liste abzubestellen, schicken Sie eine Mail an: [email protected] Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: [email protected]