Thread Frage zu sysread
(18 answers)
Opened by bianca at 2013-10-01 09:18
Hallo!
Es geht nach wie vor um die bidirektionale Kommunikation mit einer anderen Anwendung unter Windows. Folgende Simulation funktioniert: Code (perl): (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 28 29 30 #!/usr/bin/perl use strict; use warnings; use IPC::Open3 1.12; my $prog = join(' ',qw(perl doit.pl)); print "Rufe Programm '$prog' auf \n"; my ($in,$out,$err,$pid,$ausgabe,$puffer); eval { $pid = open3($in,$out,$err,$prog); }; die "Gescheitert: '$@'" if $@; if (defined $pid) { print "PID '$pid', lese...\n"; #$ausgabe .= $puffer while (sysread $out,$puffer,4096); sysread $out,$ausgabe,4096; print "Fertig mit lesen\n"; if (defined $ausgabe) { print "\n\nErhalte:\n".('=' x 30)."\n$ausgabe"; my $code = <STDIN>; chomp($code); print $in $code."\n"; sysread $out,$ausgabe,4096; print "\n\nErhalte:\n".('=' x 30)."\n$ausgabe"; } } else { die "Keine PID"; } Dazu die doit.pl: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 #!/usr/bin/perl use strict; use warnings; use IO::Handle 1.24; STDOUT->autoflush(1); print "Guten Tag!\nBitte Zugangscode eingeben: "; my $code = <STDIN>; chomp($code); print "Danke fuer '$code'\n"; Das Problem: Diese Simulation funktioniert. Aber wenn ich das Programm verwende, das tatsächlich benutzt werden soll bleibt das sysread() nach ca. 248 Byte (hab es nicht genau abgezählt) einfach stehen und kehrt nicht zurück. Wenn ich Zeile 17 durch 16 auswechsle liest es zwar die gesamte Ausgabe des Programms, kehrt aber nicht zurück. Hat jemand eine Idee, wie man das richtig macht? Wie kann ich dem sysread() sagen, dass es aufhören soll, wenn da nichts mehr kommt? Habe in älteren Artikeln gelesen, dass man bei der Konstruktion mit IPC::Open3 unbedingt sysread() verwenden muss. Oder gibt es doch Alternativen. 10 print "Hallo"
20 goto 10 |