[Flug] Forks / Kindproz. beenden

tomas at tuxteam.de tomas at tuxteam.de
Do Sep 6 19:42:42 CEST 2012


On Thu, Sep 06, 2012 at 04:48:25PM +0200, Bernhard R. Link wrote:
> * Arno Steffens <epsi at gmx.de> [120906 15:53]:
> > Wie kann der Elternprozess einen Kindprozess beenden - Kindstötung
> > scheint nicht vorgesehen? Das fängt damit an, dass der Elternprozess
> > die erzeugte PID gar nicht mitbekommt. Soweit ich sehe kann die nur
> > per shared Memory übertragen werden - oder hab ich was übersehen?
> 
> Den Rückgabewert von fork? Der ist nämlich die pid des Kindprozesses.
> 
> > Auch andersrum, wie kann man aus einem Kindprozess den Elterprozess,
> > alle Kinder einschliesslich sich selbst sauber beenden?
> 
> Das ist schwieriger und geht eigentlich nur unter bestimmten umständen
> (wenn der Elternprozess entweder selber seine Kinder aufräumt, oder
> mit irgendwelchen Tricks mit Prozessgruppen).

Genauer: wenn ein Prozess fork() aufruft, dann erbt das Kind die PGID
(process group ID). Mit einem kill() auf Prozess-ID 0 kann man ein
Signal allen Prozessen der Prozessgruppe schicken. Du erwischt damit
alle Prozesse der Gruppe, es sei den, der eine oder andere hat sich aus
der Gruppe gestohlen (das geht mit setpgid() bzw. setpgrp())

Im Anhang eine kleine Demo: ein Vaterprozess forkt 10 Kinder, im
Normalfall schlafen alle beteiligten 20 Sekunden und sterben eines
natürlichen Todes. Gibt man den Vater beim Start ein Argument (eine Zahl
von 0 bis 9), so wird das Kind mit dieser Nummer zum Killer und
masakriert die ganze Gruppe mit SIGTERM.

Ich habe noch einen signal handler eingebaut, damit man zugucken kann,
was passiert.

Natürlich sollte man sigaction() statt signal() benutzen, ausserdem ist
ein printf von einem signal handler aus ein ziemliches no-no -- aber für
eine Demo möge es durchgehen :-)

Bei Fragen -- fragen.

viele Grüsse
-- tomás
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : pgid.c
Dateityp    : text/x-csrc
Dateigröße  : 985 bytes
Beschreibung: nicht verfügbar
URL         : <http://lug-freiburg.de/pipermail/flug/attachments/20120906/c97b58b9/attachment.c>
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: Digital signature
URL         : <http://lug-freiburg.de/pipermail/flug/attachments/20120906/c97b58b9/attachment.pgp>


Mehr Informationen über die Mailingliste Flug