Thread Frage zu sysread (18 answers)
Opened by bianca at 2013-10-01 09:18

bianca
 2013-10-01 09:18
#170861 #170861
User since
2009-09-13
6991 Artikel
BenutzerIn

user image
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 CPAN:IPC::Open3 unbedingt sysread() verwenden muss.
Oder gibt es doch Alternativen.
10 print "Hallo"
20 goto 10

View full thread Frage zu sysread