Hallo Bernard! Bernard.Bramlage@kisters.de 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: alex@glintschert.de Email: info@anderes-berlin.de 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.