fork()
Results 1 to 3 of 3

Thread: fork()

  1. #1

    Title
    Master
    Join Date
    Jun 2002
    Location
    vienna
    Posts
    168
    Thanks
    0
    Thanked 0 Times in 0 Posts

    fork()

    tach auch!

    hmm... hätte da mal ne frage an alle wissensdurstigen perl fachleute.... vielleicht weiß da ja netterweise jemand rat....
    ich versuch schon die längste zeit ein perl skript als quasi lame remote auf IO::Socket basis zu erstellen... sinn des ganzen: auf winamp knopfdruck startet unix lame... sprich, winamp sendet an wartende perl schleife (horcht auf bestimmtem port) einen startstring, sodann wird lame als system-call aufgerufen...
    das ganze hätte ich mittels fork gelöst, da ich zwei prozesse brauche: einen (die erste schleife), der auf den eingehenden startstring wartet, und den zweiten (zweite schleife) der auf den eingehenden stopstring wartet.... nun funzt das ganze auch soweit, allerdings nur bis zum starten, welches im kindprozess stattfindet... unter ps is da auch alles fein aufgelistet, lame usw. und auch der noch aktive elternprozess, der nun seinerseits auf das stoppen warten würde... nur reagiert das skript hier nicht mehr, oder die entsprechende warteschleife im elternprozess wird erst gar nicht gestartet, weil der kinprozeß noch blockiert oder so.... keine ahnung, an dem punkt hänge ich leider....
    naja... langer worte langer sinn.... hoffe jemand versteht mein kauderwelsch und antwortet evanteux.....
    sogesehen bedanke ich mich jedenfalls für jedes statement....

  2. #2
    #!/usr/bin/perl's Avatar
    Title
    Elite
    Join Date
    Jan 2002
    Posts
    291
    Thanks
    0
    Thanked 1 Time in 1 Post
    naja, was ist das Problem, die zombie-processes? Wenn ja, dann gibts abhilfe:


    Code:
    use POSIX qw(:signal_h setsid WNOHANG);
    
    $SIG{TERM} = $SIG{INT} = \&do_term; # signal handler installieren, damit die child procs gekillt werden bei diesen signalen
    
    my %CHILDREN;
    
    sub launch_child {
      my $callback = shift;
      my $home     = shift;
      my $signals = POSIX::SigSet->new(SIGINT,SIGCHLD,SIGTERM,SIGHUP);
      sigprocmask(SIG_BLOCK,$signals);  # block inconvenient signals
      warn("Can't fork: $!") unless defined (my $child = fork());
      if ($child) {
        $CHILDREN{$child} = $callback || 1;
      } else {
        $SIG{HUP} = $SIG{INT} = $SIG{CHLD} = $SIG{TERM} = 'DEFAULT';
        prepare_child($home);
      }
      sigprocmask(SIG_UNBLOCK,$signals);  # unblock signals
      return $child;
    }
    
    sub prepare_child {
      my $home = shift;
      if ($home) {
        local($>,$<) = ($<,$>);   # become root again (briefly)
        chdir  $home || croak "chdir(): $!";
        chroot $home || croak "chroot(): $!";
      }
      $< = $>;  # set real UID to effective UID
    }
    
    sub reap_child {
      while ( (my $child = waitpid(-1,WNOHANG)) > 0) {
        $CHILDREN{$child}->($child) if ref $CHILDREN{$child} eq 'CODE';
        delete $CHILDREN{$child};
      }
    }
    
    sub kill_children {
      kill TERM => keys %CHILDREN;
      # wait until all the children die
      sleep while %CHILDREN;
    }
    
    sub do_term {
      warn("TERM signal received, terminating children...\n");
      kill_children();
      exit 0;
    }
    habs nicht ausprobiert, sollte aber ungefaher so gehn, wenn du also ganz normal deine socket->accept() loop einbaust und wie oben die eine ref auf do_term() in die SIG handler installierst sollte er beim schliessen die child procs killen.

    Als Literatur zu diesem Thema is "Network Programming with Perl" vom Stein sehr zu empfehlen.

    ciao

    Oliver
    Last edited by #!/usr/bin/perl; 02-08-2002 at 13:33.
    this is Unix land. In silent nights, you can hear Windows machines reboot...

  3. #3

    Title
    Veteran
    Join Date
    Mar 2005
    Posts
    2
    Thanks
    0
    Thanked 0 Times in 0 Posts
    hi,

    weiss einer wie man so eine aufgabe löst:

    #iclude<studio>
    void main(void)
    {
    printf("Guten %d/n", fork());
    printf("Morgen %d/n", fork());
    }
    ich möchte wissen was das programm ausgibt, wobei das ergebnis mittels der unten abgebildeter baum ermittelt werden soll:
    fork

    guten"101" guten"0"
    PID=10 PID=0

    fork fork

    morgen"102" morgen"0" morgen"103" morgen"0"
    PID=20 PID=0 PID=10 PID=0
    das ergebnis sollte lauten:
    guten 101
    guten 0
    morgen 103
    morgen 0
    wie kommt man aber auf z.B.:guten=101,pid=10,morgen=0,pid=0,etc.
    bitte es ist wichtig!

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •