[Flug] Forks / Kindproz. beenden

Arno Steffens epsi at gmx.de
Fr Sep 7 08:57:17 CEST 2012


-------- Original-Nachricht --------
> Datum: Thu, 6 Sep 2012 19:42:42 +0200
> Von: tomas at tuxteam.de
> An: flug at freiburg.linux.de
> Betreff: Re: [Flug] Forks / Kindproz. beenden

> 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 :-)

Ja, das ist ein sehr gutes Beispiel. Wenn jetzt im Vaterthread oder auch in den Kindern Files oder andere Resourcen geöffnet wurden, wie schliesse ich die sauber? 

Das Catchsignal ist im Vaterthread, das haben dann auch alle Kinder, dass würde bedeuten ich bekomme 11 "Ouch"? Aber was ist mit z.B. geöffneten Files o.ä.? 

Mal abgesehen davon das das nicht gut programmiert ist: Wenn eine Resource im Vater geöffnet wurde und in dessem Signalhandler ein close ist - wird dann nicht 10x die Resource vergeblich zu schliessen versucht? Nur der erste (zufällige Thread?) kann das, oder?

Wenn die Resource im Kind geöffnet wurden, muss dort ein weiterer Signalhändler eingerichtet werden - wird der geerbte überschrieben oder der neue zusätzlich eingerichtet?
 
> 
> Bei Fragen -- fragen.
> 
> viele Grüsse
> -- tomás


Ja danke, wie du siehst, hab ich noch welche ;)
Gruß Arno



Mehr Informationen über die Mailingliste Flug