Hi, Am So, den 28.12.2003 schrieb Andre Heine um 20:03:
Am Sunday 28 December 2003 19:19 schrieb Joerg Rossdeutscher:
Am So, den 28.12.2003 schrieb Andre Heine um 18:04:
Natürlich war eval das erste, was ich ausprobiert habe, danach auch etwas härtere Geschütze. :-)
Was für härtere Geschütze?
%SIG. Siehe perlipc und perlvar, suche nach "%SIG". Woran ich lange getüftelt habe: Nach einem Segfault geht eine ganze Kaskade von Signalen auf das Script nieder, die mit unterschiedlicher Priorität zur Beendigung auffordern. Wenn man einen Segfault abfangen will, muß daher ein normales Quit auch noch abfangen. Wenn du damit rumprobieren willst, setze einfach testweise(!) *alle* Signalhandler auf "Abfangen", um einen Überblick zu bekommen.
Ich verstehe halt ein Sache nicht, warum macht das z.B. der Aufruf von "system()" mit einem externen Programm richtig und fork() nicht.
Das weiss ich nicht, weil ich damit bisher keine Probleme hatte, weil ich es mit "system" nicht mache(n kann). Mit "fork" habe ich das Problem (noch) nicht, da sich dieser Thread geflissentlich in eine andere Richtung entwickelt hat. (Da sind noch zwei Mails gewesen von Thorsten und von dir, die gute Hinweise enthalten. Ich nehme mir die in Ruhe vor, ich laboriere gerade an einer Erkältung).
IIRC hast Du geschrieben, das Du wegen "unsauber" die Signale nicht abfangen möchtest, aber das würde funktionieren meinst Du.
Was ist da so "unsauber" dran, in der BIbel wird das mit dem Abfangen ja zuhauf erklärt. Scheint so, das das mehrere machen.
Ok. Pseudocode: on SEGFAULT goto WEITER for ( $i von 1 bis 30 ) { mein_speicher = malloc (10000) machwas(mein_speicher) free(mein_speicher) WEITER: } sub machwas { gefaehrlicher_befehl_hier } Sowas kannst du programmieren. Im Falle eines Segfaults in "machwas" macht das Programm bei WEITER weiter. Definiere: Ist "mein_speicher" jetzt freigegeben oder belegt? Ist der Stapelspeicher, der die Schleifen verwaltet, in einem definierten Zustand? Oder liegen da Leichen rum? Und, da Zugriffsfehler auf Prozessorebene ausgelöst werden: Verhält sich da jedes System gleich? Läuft mein Script auch noch unter OS X auf einem PowerMac? Unter Windows? Das Abfangen von Segfaults macht Sinn, um noch schnell eine Datei zu schliessen, vieleicht ein Tempfile zu löschen und danach selbst zu exit'en. Mehr nicht. Das komplette Beenden des Prozesses führt dann dazu, daß das System alles wieder freigibt, was dieser Prozess angefordert hat. Erst jetzt ist die Kiste wieder clean.
Bevor die Idee aufkommt: Aufgrund der großen Anzahl der Aufrufe ist ein externes Skript in Backticks nicht akzeptabel. Es würde mehrere zehntausend mal perl starten.
Oder die shell...
Jedenfalls was großes.
Den Grund verstehe ich, aber so würden jedenfalls weniger "undefinierte" Sachen auftauchen.
Ja. Aber. Derzeit habe ich in meiner Sammlung knapp 165.000 Fonts. Wie gefällt dir dieser Code: for ( $i = 0 ; $i < 165000 ; $i++ ) { `machwas.pl $font[$i]`; } Also, mir schmeckt das nicht besonders. Ich habe was dagegen, wenn meine Software über mein natürliches Ableben hinaus läuft. :-)
Irgendwie musst Du ja das Programm stabil kriegen.
Keine Signale abfangen, keine zwei Programme, was bleibt da dann noch? Mich interessiert das jetzt wirklich, weil diese Situation könnte mich auch bald treffen ;(
fork'en. Darauf will ich ja die ganze Zeit hinaus. Ich habe lediglich schon ein Problem mit ganz normaler Kommunikation zwischen zwei Prozessen. Der gefork'te beendet sich ganz normal und sauber, und plötzlich ist mein parent auch wech. Ich muß die Mail von Thorsten nochmal ohne Brummschädel durcharbeiten. Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/