IPC
am 03.08.2006 13:38:39 von doleman
Hallo,
Gibt es eine möglichkeit zwischen ein Kind- und ein Vaterprozess Daten
auzutauschen?
Ich müsste vom Kind aus ein Hashref an den Vater übergeben. Das soll
irgendwie mit Pipes gehen
hab aber kein Beispiel gefunden.=20
gruß
Re: IPC
am 03.08.2006 21:09:17 von Slaven Rezic
"doleman" writes:
> Hallo,
>
> Gibt es eine möglichkeit zwischen ein Kind- und ein Vaterprozess Daten
> auzutauschen?
> Ich müsste vom Kind aus ein Hashref an den Vater übergeben. Das soll
> irgendwie mit Pipes gehen
> hab aber kein Beispiel gefunden.
Die grundlegende Arbeitsweise wird in perldoc perlipc, "Bidirectional
Communication with Yourself" beschrieben. Ein Hash*ref* kannst du aber
nicht einfach so übergeben, weil das Kind typischerweise nicht auf den
Speicher des Vaters zugreifen kann. Du kannst aber Storable verwenden,
um die Daten hinter der Referenz zu deserialisieren und auf der
anderen Seite wieder zu serialisieren.
Mögliche Alternativen wären mmap oder shared memory, aber dazu kann
ich nicht viel sagen. Es gibt aber Module, die einen dabei helfen
(Tie::Mmap, IPC::Shareable).
Vielleicht hilft auch das Modul forks.pm
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Visualize Makefiles with GraphViz:
http://user.cs.tu-berlin.de/~eserte/src/perl/GraphViz-Makefi le/
Re: IPC
am 15.08.2006 18:09:29 von doleman
Ich hab mich entschieden das über pipes zu machen....
und zwar folgendermaßen:
pipe my ($reader, $writer);
my $pid =3D fork();
if ( $pid == 0 ) {
#Child
#ldapsuchanfrage
#ergebnisse in %chld_searchentries ablegen
close $reader;
$writer->autoflush(1);
store_fd \%$chld_searchentries, $writer;
POSIX::_exit($pid);
}
else {
print "$pid this is the father\n";
close $writer;
$searchentries =3D fd_retrieve($reader);
}
sollte so funktionieren oder? ich habe allerdings das problem das
$writer->autoflush das Parentprozess blockiert ohne autoflusch kommt
folgende fehlermeldung
Tk::Error: Magic number checking on storable file failed at
lib/Storable.pm (autosplit into lib/auto/Storable/fd_retrieve.al) line
346,
Was macht autoflush genau? Blockiert es das Vaterprozess solange bis
was zum lesen da ist?
danke
Slaven Rezic schrieb:
> "doleman" writes:
>
> > Hallo,
> >
> > Gibt es eine möglichkeit zwischen ein Kind- und ein Vaterprozess Daten
> > auzutauschen?
> > Ich müsste vom Kind aus ein Hashref an den Vater übergeben. Das soll
> > irgendwie mit Pipes gehen
> > hab aber kein Beispiel gefunden.
>
> Die grundlegende Arbeitsweise wird in perldoc perlipc, "Bidirectional
> Communication with Yourself" beschrieben. Ein Hash*ref* kannst du aber
> nicht einfach so übergeben, weil das Kind typischerweise nicht auf den
> Speicher des Vaters zugreifen kann. Du kannst aber Storable verwenden,
> um die Daten hinter der Referenz zu deserialisieren und auf der
> anderen Seite wieder zu serialisieren.
>
> Mögliche Alternativen wären mmap oder shared memory, aber dazu kann
> ich nicht viel sagen. Es gibt aber Module, die einen dabei helfen
> (Tie::Mmap, IPC::Shareable).
>
> Vielleicht hilft auch das Modul forks.pm
>
> Gruß,
> Slaven
>
> --
> Slaven Rezic - slaven rezic de
>
> Visualize Makefiles with GraphViz:
> http://user.cs.tu-berlin.de/~eserte/src/perl/GraphViz-Makefi le/
Re: IPC
am 17.08.2006 00:00:02 von Slaven Rezic
"doleman" writes:
> Ich hab mich entschieden das über pipes zu machen....
> und zwar folgendermaßen:
>
> pipe my ($reader, $writer);
> my $pid = fork();
> if ( $pid == 0 ) {
> #Child
> #ldapsuchanfrage
> #ergebnisse in %chld_searchentries ablegen
> close $reader;
> $writer->autoflush(1);
> store_fd \%$chld_searchentries, $writer;
> POSIX::_exit($pid);
> }
> else {
> print "$pid this is the father\n";
> close $writer;
> $searchentries = fd_retrieve($reader);
> }
>
> sollte so funktionieren oder? ich habe allerdings das problem das
> $writer->autoflush das Parentprozess blockiert ohne autoflusch kommt
> folgende fehlermeldung
> Tk::Error: Magic number checking on storable file failed at
> lib/Storable.pm (autosplit into lib/auto/Storable/fd_retrieve.al) line
> 346,
> Was macht autoflush genau? Blockiert es das Vaterprozess solange bis
> was zum lesen da ist?
Achtung: wenn du POSIX::_exit verwendest, dann musst du alle
Filehandles händisch schließen. Normalerweise wird das Schließen unter
Unix vom normalen exit() durchgeführt, aber nicht, wenn man _exit()
verwendet. Also fehlt im Child ein close $writer.
Ästhetischer Hinweis: du solltest außerdem als Exitcode 0 und nicht
$pid wählen.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Berlin Perl Mongers - http://berlin.pm.org