Bernhard Walle wrote:
Hallo,
On Mon, 29 Dec 2003 at 16:51 (+0100), Gerald Goebel wrote:
Hier scheint sich genau der Nachteil vom Multithreding bemerkbar zu machen.
Irgendwie hast Du recht.
leider ;-(
Meine Vermutung ist, der Befehl fork in Perl startet nicht einen eigenen Prozess, sondern macht nur einen eigenen Tread im Interpreter dafür auf. Neben dem Verhalten sprechen noch einige andere Aussagen dafür:
Laut Dokumentation (perldoc -f fork):
fork Does a fork(2) system call to create a new process running the same program at the same point. It returns the child pid to the parent process, 0 to the child process, or "undef" if the fork is unsuccessful. File descriptors (and sometimes locks on those descriptors) are shared, while everything else is copied. On most systems sup- porting fork(), great care has gone into making it extremely efficient (for example, using copy-on- write technology on data pages), making it the dominant paradigm for multitasking over the last few decades.
Also ganz klar ein echter fork().
Bist du dir sicher das dieses nicht auch in der Windoof-Version steht?
Diese forkemulation gibt es seit 5.6.1. Vorher galt sie als experimentel. Kann es sein das Perl mitlerweile standardmäsig so kompiliert/configuriert wird, das es auch unter Linux dise emulation nutzt, damit es sich auf Linux und Windows (M$ hat wohl diese emulation gesponsert) gleich verhält?
Ich habe hier SuSE 9.0 und das standardmäßige Perl (das vom Online- Update, da gab's mal was).
ich SuSe 8.0 und Perl 5.6.1
Folgendes Testskript:
,---- | #!/usr/bin/perl | | $pid = fork(); | | if ($pid > 0) # child
das ist der Parent
| { | print "I'm the child!\n"; | sleep 20; | } | elsif ($pid == 0) | {
das ist das Child siehe perldoc -f fork SCNR
| print "I'm the parent!\n"; | sleep 20; | } | else | { | print "Could not fork: $!"; | } | | print "We do that both!\n"; `----
[~] $ perl test.pl I'm the parent! I'm the child!
Auf 'ner anderen Konsole:
[~] $ ps aux | grep test.pl | grep perl bwalle 12816 0.0 0.2 3584 1420 pts/3 S 17:16 0:00 perl test.pl bwalle 12817 0.0 0.2 3584 1420 pts/3 S 17:16 0:00 perl test.pl
[~] $ kill -SEGV 12817 [~] $ ps aux | grep test.pl | grep perl bwalle 12816 0.1 0.2 3584 1420 pts/3 S 17:16 0:00 perl test.pl
Bei mir wird das Child auch zum Deamon ppid == 1.
Hier also ein ganz klares fork, aber das komische ist dass es hier der Elternprozess auch nicht stibt. Ok, es ist kein echter Speicherzugriffs- fehler.
Naja, der Fehler wird doch nicht durchgereicht, sondern nur das Signal das durch den Fehler erzeugt wird, oder? Und den gibst du ihn ja.
Aber irgendwie ist das jetzt eine gute Gelegenheit, mal etwas C ins Spiel zu bringen *Perl-Buch rauskram* *les* *etwas später*
Kannst du diese Perl-Buch nicht mal ratti leihen?
Auch hier lebt der Parent eindeutig weiter.
ist ja auch richtig.
Strange.
nur das verhalten von rattis Perl. Noch was komisches: Jörg Poßdeutscher schrieb:
Geguckt habe ich bisher in der perldoc unter perlipc und perlfork
unter perldoc finde ich weder perlfork noch perlipc kann es sein das ratti ein perl benutzt welches die emulation benutzt und deshalb diese Probleme hat? @ratti: wenn du einen testcode hat, der bei dir nicht läuft, poste ihn bitte hier, denn mit scheint das du ein verkonfiguriertes Perl hast. @Bernhard: kanst du mal nachgucken ob du bei dir "perlfork" in der perldoc findest? cu Gerald