trsh & zombies - was sonst?

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

trsh & zombies - was sonst?
Hi Leute,

ich habe ein kleines ziemlich konfuses Problem mit meiner trsh:
Ich versuche einen Signal-Handler für SIGCHLD einzurichten, damit später mal brav alle Zombies gepfählt werden können. Zunächst lasse ich den Handler aber mal leer.
Wenn ich einen Hintergrundprozess (zB ‘kedit&’) starte und ihn dann wieder zumache, dann beendet sich trsh automatisch.
Das passiert nicht, wenn ich den Signalhandler einfach weglasse…

Irgendwer eine Idee woran das liegen könnte? Nicht dass ich irgendwas simples vergessen habe…

Grüße,
lo_pez


Das Standardverhalten bei SIGCHLD Empfang ist ignorieren, d.h. es wird nichts unterbrochen.
Wenn du den Childhandler installierst, dann wird die Funktion im regulaeren Programm unterbrochen. Wenn der Childhandler zuende ist, wird das regulaere Programm fortgesetzt. Allerdings schlaegt die Funktion, die unterbrochen wurde eventuell fehl, setzt errno und liefert einen Fehler zurueck.

Beheben kann man das Problem mit 3 Moeglichkeiten:

  1. Jede Funktion die unterbrochen werden kann, nach derem Aufruf pruefen und gegebenenfalls neu starten.

  2. Beim sigaction das flag SA_RESTART mit setzen, damit werden solche Funktionen automatishc neu gestartet.

  3. Das Signal blockieren und bei geeigneter Zeit wieder deblockieren, oder mittels sigpending regelmaessig abfragen, ob eines gekommen ist.

  4. In die anderen Threads im Forum schauen, da steht des naemlich alles schonmal. Nochmal schreib ichs net!

Fuer die trsh kann ich mir nur mit 1. und 2. eine vernuenftige Lsg vorstellen.

thx

hmm, klingt soweit plausibel, mir ist nur nicht klar, was bei mir unterbrochen wird, dass dann dazu führt, dass sich trsh beendet.

hat lösung 2 gegenüber lösung 1 irgendeinen nachteil? immerhin sieht 1 nach mächtig viel code aus…

da habe ich mich schon gründlich umgeschaut, sonst wäre ich nie soweit gekommen :slight_smile: habe eben den zusammenhang zwischen unterbrechung und programm-beendigung nicht gesehen…
thx für die infos.


naja irgendwoher kommt ein SIGCHLD (z.b. weil ein hintergrundprozess zuende ist), dein programm hängt gerade an igrendeinem punkt (wartet auf ne eingabe o.ä.), dann wird der signalhandler aktiv „schaut“ nach was er machen soll, macht das was zu tun ist oder wenn gar nichts zu tun ist springt er zurück ins programm. die funkion die unterbrochen wurde hat aber nen fehler geliefert(weil sie mit der unterbrechung nicht klar kommt, soweit ich mich erinner sind nur manche funktionen reentrant) und jetz beendet sich deine trsh.
am einfachsten lässt sich das mit SA_RESTART verhidnern