kleinerroemer: Fork Prozessübergreifende variablen

Guten Morgen!

Nachdem bei der letzten frage glaube ich hauptsächlich die Problemstellung von mir schlecht erklärt worden ist..
werd ich das versuchen jetzt zu vermeiden...

also:

In meinem Skript gibt es ein Array von Objekten.
In einer foreach schleife wird dann für jedes Objekt ein eigener Prozess erzeugt,
in das jeweilige Objekt mit daten gefüttert werden soll. DAs sieht so aus:

foreach( @$obj ) #ist eigenltich ein pointer auf ein array.... egal
 {
 $pid = fork();
 if( $pid == 0 ) #child
 {
  &setobj( $_ );
  exit 0;
 }
 else
 {
  push( @pids, $pid );
 }
}

Nachdem fork ja eine "kopie" des Prozesses und allen variablen erstellt..
sollte im kindprozess der aufruf von setobj( $_ ) ja auf das gleiche Objekt wie im Elternprozess zeigen.

sub setobj #sieht ca so aus:
{
 my $obj = shift;
 $$obj -> setval( "WERT" );
}

Das Problem ist, dass ich nachher im Elternprozess keine Daten in meinem obj habe, und ich verstehe nicth wieso.
durch die REferenz auf das Objekt müsste der kindprozess doch eigenltihc auf den gleichen speicher schreiben, den der Elternprozess verwendet oder..?

Danke scon mal und lg.
Roman

  1. Ok das das ganze unter shared Memory fällt hab ich natürlich komplett vergessen.. naja... wie dem auch sei..
    ich hab da bis jetzt keine sinvollen Informationen im Internet bekommen.. hat da jemand schon Erfahrungen damit in Perl.. gibts da gute Module dafür..??

    lg.

  2. In einer foreach schleife wird dann für jedes Objekt ein eigener Prozess erzeugt, in das jeweilige Objekt mit daten gefüttert werden soll.

    Schlechte Idee, denn wenn der Kindprozess beendet ist, sind auch alle dort vorgenommenen Manipulationen an Variablen weg. Stelle dir das so vor, dass fork() wie ein Kopierer eine identische Kopie des gerade laufenden Prozesses einschließlich aller zu diesem Zeitpunkt bekannten Daten anfertigt. Diese Kopie wird nun neben dem Elternprozess weiterverarbeitet, und zwar von Haus aus unabhängig. Ist der Kindprozess beendet, sind alle Kopien einschließlich der Manipulationen verloren, so als ob du die Kopie zerrissen hättest.

    Nachdem fork ja eine "kopie" des Prozesses und allen variablen erstellt.. sollte im kindprozess der aufruf von setobj( $_ ) ja auf das gleiche Objekt wie im Elternprozess zeigen.

    Nein, nur auf eine Kopie, denn einzig Filehandles werden geteilt. Du musst also für eine Kommunikation beider Prozesse sorgen, dafür gibt es pipe(). Das könnte vereinfacht so aussehen:

    pipe(READER,WRITER);  
      
    my $ort = 'zu Hause';  
      
    my $pid = fork();  
      
    if($pid == 0){  
      # Kindprozess  
      close READER;  
      my $ort = 'im SELFFORUM';  
      print "Das Kind ist $ort\n";  
      print WRITER $ort;  
      exit(0);  
    }  
    else{  
      # Elternprozess  
      close WRITER;  
      print "Die Eltern waren $ort\n";  
      $ort = <READER>;  
      print "Die Eltern sind jetzt auch $ort\n";  
      wait();  
    }  
      
    print "Prozesse beendet, alle sind $ort.";
    

    Schau dir das Ganze mal an, auch die sehr umfangreichen Erläuterungen in perlipc, wenn noch was unklar ist, frage nochmal nach.

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
    1. Noch ein kleines Beispiel mit mehreren Prozessen:

      use strict;  
      use warnings;  
        
      my @plist;  
      my $z = 0;  
        
      for (1..5) {  
        pipe(READER,WRITER);  
        my $pid = fork();  
        die $! if($pid == -1);  
        if($pid) {  
          close WRITER;  
          push @plist, <READER>;  
          wait;  
        }  
        else {  
          close READER;  
          chomp($z = <STDIN>);  
          print WRITER $z;  
          exit(0);  
        }  
      }  
        
      print join "\n", @plist;
      

      Vielleicht hilft's.

      Siechfred

      --
      Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
      1. close READER;
            chomp($z = <STDIN>);
            print WRITER $z;

        prinzipiell würde das ja hinhaun..
        aber in mein Objekt des Elternprozesses kommen nicht nur strings rein.. sondern teilweise weitere Arrays die wieder Objekte enthalten.. also relative verschachtelt...
        so würde das nur funktionieren wenn ich nur textdaten im kindprozess erzeugen und übertragen müsste...

        Ich könnte natürlich die ganzen Objekte im Elternprozess nur aus den Daten der Kindprozesse erzeugen..
        aber mir würde es besser gefallen.. wenn ich die ganze Objekte in den Kindprozessen generiere und an den Elternprozess weitergebe...

        Ich habe mich ein bisschen umgesehen zum thema shared memory.. hab da aber nicht wirklich was sinnvolles gefunden...

        hat damit jemand erfahrungen..?

        Roemer

        1. Ich muss jetzt leider weg.. und werd erst nächste Woche wieder kommen...

          Also dann hoffentlich bis nächste Woche.. cu

          Roemer

          1. Ich muss jetzt leider weg.. und werd erst nächste Woche wieder kommen...

            Vielleicht erreicht dich das hier noch, habe gerade mal auf CPAN geschaut, da gibt's ein Modul, das dir vielleicht hilft:
            http://search.cpan.org/~aristotle/Proc-Fork-0.4/

            Siechfred

            --
            Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        2. aber in mein Objekt des Elternprozesses kommen nicht nur strings rein.. sondern teilweise weitere Arrays die wieder Objekte enthalten.. also relative verschachtelt... so würde das nur funktionieren wenn ich nur textdaten im kindprozess erzeugen und übertragen müsste...

          Dafür gibt es diverse Module: http://search.cpan.org/search?query=Serialize

          Ich könnte natürlich die ganzen Objekte im Elternprozess nur aus den Daten der Kindprozesse erzeugen.. aber mir würde es besser gefallen.. wenn ich die ganze Objekte in den Kindprozessen generiere und an den Elternprozess weitergebe...

          Wozu? Der Kindprozess liefert dem Elternprozess die Daten, die dort dann strukturiert werden. Prozesse können nunmal nur über pipes miteinander kommunizieren, warum also willst du dir das Leben so schwer machen?

          Siechfred

          --
          Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.