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.
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
perldoc ist der Befehl: # perldoc perlipc # perldoc perlfork ...oder online und ordentlich formatiert unter www.perldoc.com
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. Code anbei. Was der Code tun SOLL ist: -forken -dissoziieren mit setsid Dann sollen beide Prozesse miteinander kommunizieren. Der (ehemalige, weil dissoziierte) Parent gibt durch einen gemeinsamen Socket den Befehl "DO", woraufhin das (ex-)Child mit einer 30%igen Wahrscheinlichkeit "abstürzt" - hier einfach mit der Meldung "e" (wie Error) exitet, um das zu simulieren. Später wird es natürlich eine echte Aktion ausführen und ggf. echt Segfaulten. Außerdem versteht Child den Befehl "DIE" (beende dich) und "HELLO" (Lebst du noch?) Wenn ja, antwortet es mit SMACK [Küßchen. Süß, ne?] ). Das "DO" wird 20 mal geschickt. Nach jedem "DO" überprüft Parent, ob Child noch "lebt", wenn nicht, soll ein neues Child gefork't werden. Zusammenfassend: Es sollten 20 "DO"'s ausgeführt werden, und einige davon würden eben "abstürzen" ('e' ausgeben), das Programm sollte durchlaufen. Aber, was wirklich passiert: Der erste "Absturz" gibt ein "e" aus (korrekt) und beendet dann sofort Child und Parent (Hä?). #!/usr/bin/perl -w use warnings; use strict; use Socket; use IO::Handle; use POSIX ":sys_wait_h"; use POSIX 'setsid'; # thousands of lines just for autoflush :-( # We say AF_UNIX because although *_LOCAL is the # POSIX 1003.1g form of the constant, many machines # still don't have it. my ($pid,$line); my ($kid,$parent); new_socket(); my $kid_pid = fork_kid(); if ( $parent ) { #parent my $alive; for ( my $i=0 ; ( $i<20 ) && ( $kid == 0) ; $i++) { $alive=kid_alive($kid_pid); if ($alive) { print CHILD "DO\n"; } else { new_socket(); $kid_pid=fork_kid(); } sleep 1; } # maybe we forked because kid died, # so "kid" can occur in parent process. # Get out here, go kid. if ( $parent ) { print "died as parent\n"; print CHILD "DIE\n"; waitpid($kid_pid,0); } if ( $kid ) { print "died as kid\n"; } } if ($kid) { #child print "kid runs\n"; while (1) { $line = <PARENT>; chomp $line; if ( $line eq "HELLO" ) { print PARENT "SMACK\n"; } if ( $line eq "DO" ) { if ( int(rand(100)) < 30 ) { die "e\n"; } } if ( $line eq "DIE" ) { close PARENT; exit; } } } sleep 4; sub fork_kid { $pid = fork; if ($pid != 0) { #parent close PARENT; $parent=-1; $kid=0; return $pid; } else { #kid die "cannot fork: $!" unless defined $pid; close CHILD; setsid or die "Can't start a new session: $!"; $parent=0; $kid=-1; return 0; } } sub kid_alive { my $pid=shift; if (! defined $pid ) { return 0; } # Undefined pid: Never forked before my $kid = waitpid( $pid , WNOHANG); if ( $kid == -1 ) { return 0; } # No such process # Found a(!) process. Is it the right one? 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. } sub new_socket { socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC) or die "socketpair: $!"; CHILD->autoflush(1); PARENT->autoflush(1); } -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/