Siechfred: Fork Prozessübergreifende variablen

Beitrag lesen

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.