Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8040[/thread]

Socket.pm (socketpair): bidirektionale Kommunikation



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
bloonix
 2006-05-31 16:49
#66838 #66838
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Leute,

das folgende Beispiel hängt

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use strict;
use warnings;
use Socket;

$| = 1;

my ($kidfh, $dadfh);
socketpair($kidfh, $dadfh, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
or die "socketpair: $!";

if (my $pid = fork) {
close $dadfh;
print $kidfh "Parent Pid $$ sendet dies\n";
# PARENT HAENGT HIER
chomp(my $line = <$kidfh>);
print "Parent Pid $$ liest gerade dies: $line\n";
close $kidfh;
waitpid($pid,0);
} else {
close $kidfh;
# CHILD HAENGT HIER
chomp(my $line = <$dadfh>);
print "Child Pid $$ liest gerade dies: $line\n";
print $dadfh "Child Pid $$ sendet dies\n";
close $dadfh;
exit;
}


und ich weiß echt nicht warum. Normalerweise sollte es funktionieren.

Viele Grüße,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-05-31 17:08
#66839 #66839
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ok, ich habe das Problem gefunden! Mir fehlt ein Autoflush auf das
Socketpaar.

Code: (dl )
1
2
select(((select($kidfh), $| = 1))[0]);
select(((select($dadfh), $| = 1))[0]);


Aber hat jemand die Muße mir zu erklären, was da genau passiert?
Die ganzen Klammern bringen mich absolut durcheinander.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
GwenDragon
 2006-05-31 17:40
#66840 #66840
User since
2005-01-17
14785 Artikel
Admin1
[Homepage]
user image
Select liefert ein Filehandele zurück.
Das ist ähnlich wie:
Code: (dl )
my $oldfh = select($kidfh); $| = 1; select($oldfh);


Ginge nicht auch sowas?
Code: (dl )
1
2
use IO::Handle;
$kidfh->autoflush(1);
\n\n

<!--EDIT|GwenDragon|1149083022-->
bloonix
 2006-05-31 17:46
#66841 #66841
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@Gwen,

jo, ich wußte nicht, dass select in einem skalaren Kontext
das aktuelle Filehandle zurückliefert.

Wie kann ich denn das aktuelle Filehandle ohne select sichern?

my $oldfh = ${IRGENDWAS};

Ich durchsuche gerade die Dollar-Variablen, aber ich finde da leider
nichts.\n\n

<!--EDIT|opi|1149083297-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-05-31 17:53
#66842 #66842
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=GwenDragon,31.05.2006, 15:40]Ginge nicht auch sowas?
Code: (dl )
1
2
use IO::Handle;
$kidfh->autoflush(1);
[/quote]
Ja, hast du das aus der Perlbibel?

Was meint der Autor wohl mit den Aussagen:

Quote
select((select(STDERR), $| = 1)[0])
...
Das kommt dabei heraus, wenn sie Lisp gerade so gut beherrschen,
um gefährlich sein zu können.

und
Quote
use IO::Handle; # Leider ist das *kein* kleines Modul

Beide Zitate aus dem Buch von O'Reilly, Programmieren mit Perl, 2. Auflage, Seite 804

Weiß du, welche Bedenken den Autor hier beunruhigen?\n\n

<!--EDIT|opi|1149083918-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
betterworld
 2006-05-31 17:54
#66843 #66843
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Ich verwende da lieber die Autoflush-Funktion aus IO::Handle, statt mit select und $| herumzujonglieren.
GwenDragon
 2006-05-31 18:03
#66844 #66844
User since
2005-01-17
14785 Artikel
Admin1
[Homepage]
user image
@opi
Aus der Perldoku zu select ;)

Was den Autor so beunruhigt kann ich nicht sagen.

Quote
use IO::Handle; # Leider ist das *kein* kleines Modul

Wahrscheinlich wegen der 250 Zeilen Perl-Code anstatt einer, ;)\n\n

<!--EDIT|GwenDragon|1149084539-->
GwenDragon
 2006-05-31 18:04
#66845 #66845
User since
2005-01-17
14785 Artikel
Admin1
[Homepage]
user image
@betterworld

Das Konstrukt ist zwar richtig "nett perlish-freaky", aber ehrlich gesagt habe ich auch die Version, bei der ich sehe, was gemeint ist, lieber.
betterworld
 2006-05-31 18:05
#66846 #66846
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Stimmt natuerlich, "autoflush" hat ein bisschen wenig Sonderzeichen... aber ich mag es trotzdem :)
bloonix
 2006-05-31 18:19
#66847 #66847
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Also select() ist ja so fein und gibt mir immer das letzte aktuelle
Handle zurück.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use Socket;

my ($kidfh, $dadfh);
socketpair($kidfh, $dadfh, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
  or die "socketpair: $!";

my $oldfh;

$oldfh = select $kidfh;
print STDOUT $oldfh, "\n";
$oldfh = select $dadfh;
print STDOUT $oldfh, "\n";


Ausgabe:
main::STDOUT
GLOB(0x648290)


Aber wie kann ich das akutell verwendete Handle ohne select()
sichern?\n\n

<!--EDIT|opi|1149085232-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-05-31 16:49.