Fork Prozessübergreifende variablen
kleinerroemer
- perl
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
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.
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
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
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
Ich muss jetzt leider weg.. und werd erst nächste Woche wieder kommen...
Also dann hoffentlich bis nächste Woche.. cu
Roemer
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
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