Hallo, Ich möchte nur einen ganz einfachen Vorschlag dazu abgeben. Ich bitte um Verzeihung, falls er vollkommen schwachsinnig ist. Am Sonntag, 28. Dezember 2003 22:39 schrieb Joerg Rossdeutscher:
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:
Lauter ge%SIGge...
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?
Zumindest unter Windows kommen Fontlinge sowieso nicht weit. Da finden die nicht mal /usr . ;-)
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]`; }
Kann mach was nicht einfach einfach etwas zurück geben, wenn kein Font gefunden wurde? Also ungefähr so: my $ueberhaupt_nichts = 0; for($i = 0; $ueberhaupt_nichts == 0; $i++) { #Mit einer Pipe, da mir grade die Syntax fuer Backtics nicht einfaellt open(MACHWAS, "machwas.pl $font[$i] |"); #Irgendwie einlesen und die Ausgabe auswerten #Wenn das Perlscript kein Font mehr fand $ueberhaupt_nichts = 1 if irgendeine spezielle Ausgabe; close(MACHWAS) }
Also, mir schmeckt das nicht besonders. Ich habe was dagegen, wenn meine Software über mein natürliches Ableben hinaus läuft. :-)
Wenn das Programm auf jeden Fall immer einen Font findet oder mit einem Fehler aufhört, geht das so, da ja die Ausgabe, wenn es keinen Font findet, sich von beiden unterscheiden dürfte.
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.
Geht Forken eigentlich auch unter Windows? Das müsste ja eigentlich wie kill oder waitpid Unixspezifisch sein. Ferdinand