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

< Previous Next >
Re: forken in perl
  • From: Gerald Goebel <gerald@xxxxxxxxx>
  • Date: Tue, 30 Dec 2003 00:10:27 +0100
  • Message-id: <3FF0B463.30705@xxxxxxxxx>
hi ratti, hi Liste,

Joerg Rossdeutscher wrote:
Am Mo, den 29.12.2003 schrieb Gerald Goebel um 22:01:
Bernhard Walle wrote:
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?

:-)
Ich habe wahrlich Doku ohne Ende, das Netz ist voll, Bücher habe ich
auch. Ich habe einen Denkfehler.

Glaub ich dir ich meinte aber dieses Perl-Buch: Perl-Buch lesen, und C programmieren ;-)

perldoc ist der Befehl:
# perldoc perlipc
# perldoc perlfork

...oder online und ordentlich formatiert unter www.perldoc.com

Habe die ganze Zeit "perldoc -f perlfork" versucht,
mit "perldoc perlfork" finde ich es auch.


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.


Glaube ich nicht.

stimmt, dein Code funktionierte bei mir auch nicht.

Code anbei. Was der Code tun SOLL ist:

Das war gut, beachte Zeitform im letzten Satz von mir.


Aber, was wirklich passiert:
Der erste "Absturz" gibt ein "e" aus (korrekt) und beendet dann sofort
Child und Parent (Hä?).

Deine kid_alive ist das problem:

sub kid_alive {
my $pid=shift;
if (! defined $pid ) { return 0; }
# Undefined pid: Never forked before

my $kid = waitpid( $pid , WNOHANG);

solang der kid läuft gibt waitpid 0 zurück.
ist kid aber beendet, gibt waitpid die pid des beendeten kid zurück.

if ( $kid == -1 ) { return 0; }
# No such process

bis hierher noch kein problem.

# Found a(!) process. Is it the right one?

aber hier: ob kid noch läuft oder nicht, er versucht zu schreiben und zu lesen.

print CHILD "HELLO\n";
chomp(my $line = <CHILD>);
if ( $line eq "SMACK" ) { return -1; }
# Kid's alive and replies

return 0;
# Uh. Rang the wrong door, or kid's dead.
}
benutzte mal diesen code:

sub kid_alive {
my $pid=shift;
if (! defined $pid ) { return 0; }
# Undefined pid: Never forked before
my $kid = waitpid( $pid , WNOHANG);
if ($kid == 0 ){
print CHILD "HELLO\n";
chomp(my $line = <CHILD>);
if ( $line eq "SMACK" ) { return -1; }
# Kid's alive and replies
}
return 0;
}

hth

cu Gerald


< Previous Next >
Follow Ups