Mailinglist Archive: opensuse-programming-de (151 mails)

< Previous Next >
Re: forken in perl
  • From: Joerg Rossdeutscher <ratti@xxxxxxxxxxx>
  • Date: Sun, 28 Dec 2003 22:39:26 +0100
  • Message-id: <1072647566.665.181.camel@xxxxxxxxxxx>
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/
< Previous Next >