$SIG{CHLD} verhält sich komisch

Hallo,
Und zwar folgendes Problem es geht um eine Perl Tk Anwendung. Ich
benutze fork() und SIG{CHLD}:

pipe my ( $reader, $writer );
my $pid =3D fork();

#Kind
if ( $pid =3D=3D 0 ) {
close $reader;
#ldapsuchanfrage
#erebnisse in hash ablegen
$writer->autoflush(1);

#hash über storable auf $writer
store_fd \%$chld_searchentries, $writer;

print "ergebnisse liegen jetzt vor!!!\n";
POSIX::_exit($pid);
}
#Vater
else {
close $writer;

$SIG{CHLD} =3D sub {
print "sigchld...\n";

#entries über storable von pipe lesen
$searchentries =3D fd_retrieve($reader);

#dann $searchentries auf tk widget ausgeben.....
wait();
};
Es passiert folgendes: Ich starte die Suche sie läuft, die ergebnisse
werden mit store_fd abgelegt, es kommt der Text: "ergebnisse liegen
jetzt vor!!!" und dann sollte eigentlich der SIG{CHLD} kommen tut er
aber nicht nur wenn ich die Mouse bewege oder eine Taste drück
wahrscheinlich irgend ein Event auslöse....
Hat irgend jemand Ahnung voran das liegen könnte bzw. eine idee wie
ich das Problem lösen kann? danke
gruss
Andre
doleman [ Mi, 16 August 2006 19:17 ] [ ID #1433220 ]

Re: $SIG{CHLD} verhält sich komisch

"doleman" <capulapeste [at] yahoo.com> writes:

> Hallo,
> Und zwar folgendes Problem es geht um eine Perl Tk Anwendung. Ich
> benutze fork() und SIG{CHLD}:
>
> pipe my ( $reader, $writer );
> my $pid = fork();
>
> #Kind
> if ( $pid == 0 ) {
> close $reader;
> #ldapsuchanfrage
> #erebnisse in hash ablegen
> $writer->autoflush(1);
>
> #hash über storable auf $writer
> store_fd \%$chld_searchentries, $writer;
>
> print "ergebnisse liegen jetzt vor!!!\n";
> POSIX::_exit($pid);
> }
> #Vater
> else {
> close $writer;
>
> $SIG{CHLD} = sub {
> print "sigchld...\n";
>
> #entries über storable von pipe lesen
> $searchentries = fd_retrieve($reader);
>
> #dann $searchentries auf tk widget ausgeben.....
> wait();
> };
> Es passiert folgendes: Ich starte die Suche sie läuft, die ergebnisse
> werden mit store_fd abgelegt, es kommt der Text: "ergebnisse liegen
> jetzt vor!!!" und dann sollte eigentlich der SIG{CHLD} kommen tut er
> aber nicht nur wenn ich die Mouse bewege oder eine Taste drück
> wahrscheinlich irgend ein Event auslöse....
> Hat irgend jemand Ahnung voran das liegen könnte bzw. eine idee wie
> ich das Problem lösen kann? danke

Das könnte an "Safe signals" liegen (siehe perldoc perlipc).
Signal-Handler werden erst aufgerufen, wenn ein Perl-Opcode
abgearbeitet wurde. Wenn in der Tk-Applikation nichts passiert, dann
wird auch kein Opcode abgearbeitet. Vielleicht reicht es, wenn du ein
Dummy-Repeat

$mw->repeat(1000, sub { });

laufen lässt. Eventuell musst du etwas in das sub {} schreiben.

Gruß,
Slaven

--
Slaven Rezic - slaven <at> rezic <dot> de

sf-upload: make batch releases on SourceForge
http://sf-upload.sf.net
Slaven Rezic [ Do, 17 August 2006 00:06 ] [ ID #1433226 ]

Re: $SIG{CHLD} verhält sich komisch

Stimmt, es liegt wohl an den safe-signals.
Ein dummy-repeat reicht, auch leer...:)
Nochmals danke für deine Hilfe ohne dich hät ich das Tool niemals
hingekriegt.....
Es ist zwar noch lange nicht fertig wird aber langsam...
thx
gruss
Andrei


Slaven Rezic schrieb:

> "doleman" <capulapeste [at] yahoo.com> writes:
>
> > Hallo,
> > Und zwar folgendes Problem es geht um eine Perl Tk Anwendung. Ich
> > benutze fork() und SIG{CHLD}:
> >
> > pipe my ( $reader, $writer );
> > my $pid =3D fork();
> >
> > #Kind
> > if ( $pid =3D=3D 0 ) {
> > close $reader;
> > #ldapsuchanfrage
> > #erebnisse in hash ablegen
> > $writer->autoflush(1);
> >
> > #hash über storable auf $writer
> > store_fd \%$chld_searchentries, $writer;
> >
> > print "ergebnisse liegen jetzt vor!!!\n";
> > POSIX::_exit($pid);
> > }
> > #Vater
> > else {
> > close $writer;
> >
> > $SIG{CHLD} =3D sub {
> > print "sigchld...\n";
> >
> > #entries über storable von pipe lesen
> > $searchentries =3D fd_retrieve($reader);
> >
> > #dann $searchentries auf tk widget ausgeben.....
> > wait();
> > };
> > Es passiert folgendes: Ich starte die Suche sie läuft, die ergebnisse
> > werden mit store_fd abgelegt, es kommt der Text: "ergebnisse liegen
> > jetzt vor!!!" und dann sollte eigentlich der SIG{CHLD} kommen tut er
> > aber nicht nur wenn ich die Mouse bewege oder eine Taste drück
> > wahrscheinlich irgend ein Event auslöse....
> > Hat irgend jemand Ahnung voran das liegen könnte bzw. eine idee wie
> > ich das Problem lösen kann? danke
>
> Das könnte an "Safe signals" liegen (siehe perldoc perlipc).
> Signal-Handler werden erst aufgerufen, wenn ein Perl-Opcode
> abgearbeitet wurde. Wenn in der Tk-Applikation nichts passiert, dann
> wird auch kein Opcode abgearbeitet. Vielleicht reicht es, wenn du ein
> Dummy-Repeat
>
> $mw->repeat(1000, sub { });
>
> laufen lässt. Eventuell musst du etwas in das sub {} schreiben.
>
> Gruß,
> Slaven
>
> --
> Slaven Rezic - slaven <at> rezic <dot> de
>
> sf-upload: make batch releases on SourceForge
> http://sf-upload.sf.net
doleman [ Do, 17 August 2006 09:59 ] [ ID #1434715 ]
Perl » de.comp.lang.perl.misc » $SIG{CHLD} verhält sich komisch

Vorheriges Thema: Fragen zu UNIVERSAL
Nächstes Thema: Perl und VBA?