1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

fork()

  • wjsus
  • 31. Juli 2002 um 11:55
  • Unerledigt
  • wjsus
    3
    wjsus
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 31. Juli 2002 um 11:55
    • #1

    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....

  • #!/usr/bin/perl
    8
    #!/usr/bin/perl
    Mitglied
    Reaktionen
    2
    Punkte
    612
    Beiträge
    114
    • 2. August 2002 um 12:24
    • #2

    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;
    }
    Alles anzeigen

    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

    this is Unix land. In silent nights, you can hear Windows machines reboot...

  • laie
    2
    laie
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 17. März 2005 um 17:14
    • #3

    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!

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung