[Flug] Forks / Kindproz. beenden

tomas at tuxteam.de tomas at tuxteam.de
Sa Sep 8 13:03:51 CEST 2012


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Fri, Sep 07, 2012 at 08:57:17AM +0200, Arno Steffens wrote:

[...]

> > 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? 

(nitpick) das sind keine Threads, sondern "ausgewachsene" Prozesse, d.h.
jeder hat seinen eigenen Stack (da leben z.B. die lokalen Variablen).
Die Kinder erben zwar eine Kopie des Vaterstacks (deshalb können die
im Beispiel gucken, wie weit die Zählvariable ist und ggf zum Killer
werden), aber wenn sie in den Variablen rummantschen sehen die anderen
es nicht.

> 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.ä.? 

Files werden unter UN*X immer beim Beenden eines Prozesses geschlossen.
Dafür sorgt das Betriebssystem. Für den Inhalt ist natürlich die
Anwendung verantwortlich -- kann schon sein, dass da Kraut und Rüben
drinsteht.

> 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?

Wie gesagt, keine Threads, sondern Prozesse. Jeder Prozess könnte
mehrere Threads "enthalten" -- Threads sind viel enger gekoppelt.

Die Kinder erben bei fork() standardmässig Kopien der file descriptors:
d.h. sie haben alle eine Klinke an die offenen Dateien des Papas
(deshalb können im Beispielprogramm alle an die Konsole quatschen: sie
haben stdout geerbt). Wenn jetzt mehrere Programme mit seek() und
write() auf derselben Datei rumrutschen, dann sollten sie sich schon
irgendwie absprechen, damit es kein Rübenbeet wird :-)

> 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?

Kinder erben die signal handler-Einstellungen des Vaters (s. Beispiel:
dort wurde das Ding im Vater eingerichtet -- die Kinder hatten es dann).
Was Du nach dem fork() machst (Vater oder Kind) sehen die anderen nicht
mehr.

Mich irritiert bei Deiner Frage, dass Du von "Resource" und "signal
handler" in einem Atemzug sprichst. Den signal handler habe ich im
Beispiel auch nicht wegen irgendwelcher Resourcen eingerichtet, sondern
damit man die Klageschreie der jeweiligen Prozesse von der Konsole aus
verfolgen kann :-)

Viele Grüsse
- -- tomás
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFQSyYXBcgs9XrR2kYRAoVIAJ0TdDMREKBXYTDdH3p10JdPI0G/hgCfVK1+
XTZ5bYnSErGpgMeDwmzTTxc=
=x/+0
-----END PGP SIGNATURE-----



Mehr Informationen über die Mailingliste Flug