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]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.