Mailinglist Archive: opensuse-programming-de (151 mails)
| < Previous | Next > |
Re: forken in perl
- From: Ferdinand Ihringer <Ferdinand.Ihringer@xxxxxxxx>
- Date: Mon, 29 Dec 2003 01:37:05 +0100
- Message-id: <200312290137.06507.Ferdinand.Ihringer@xxxxxxxx>
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
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
| < Previous | Next > |