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"; }
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";
2013-10-01T14:51:59 topegDu könntest schauen ob du das lesen nicht nonblocking machen kannst.
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 31 32
#!/usr/bin/perl use strict; use warnings; use IPC::Open3 1.12; use IO::Handle 1.24; 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); $out->blocking(0); }; 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"; }
2013-10-01T17:09:57 biancaGewundert hat mich auch, dass es keine Fehlermeldung gab, als ich use IO::Handle 1.24; nicht drin hatte. Ich dachte, das wäre eine Funktion von IO::Handle?
1 2 3 4 5 6 7 8
for( my $i = 1; $i <= 10; $i++ ) { last unless $out; print "Calling sysread; "; my $bytes = sysread($out, $buffer, 4096); print "Try #$i: $bytes Bytes read.\n"; last unless $bytes; print "$buffer\n\n"; }
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 31 32 33 34 35 36 37 38
#!/usr/bin/perl use strict; use warnings; use IPC::Open3; use IO::Handle; STDOUT->autoflush(1); my $prog = join(' ',qw(perl doit.pl)); print "Rufe Programm '$prog' auf \n"; my ($in,$out,$err,$pid,$ausgabe,$buffer); eval { $pid = open3($in,$out,$err,$prog); $out->blocking(0); }; die "Gescheitert: '$@'" if $@; if (defined $pid) { print "PID '$pid', lese...\n"; for( my $i = 1; $i <= 100000; $i++ ) { undef $buffer; #select(undef, undef, undef, 0.25) # Verzoegerung my $bytes = sysread($out, $buffer, 4096); $ausgabe .= $buffer if $buffer; #last if $ausgabe && ! $bytes; # Abbruch sobald einmal nichts mehr gelesen wurde } 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"; }
2013-10-02T13:41:44 murphyüber Win32::API anstreben sollte.
2013-10-02T13:41:44 murphyAllerdings befürchte ich, dass es bei der internen Umsetzung von Sockets auf Win32-Handles auch wieder irgendwelche Reibungsverluste gibt.
2013-10-02T13:47:35 martin.g2013-10-02T13:41:44 murphyüber Win32::API anstreben sollte.
Hatte ich mir auch schon angesehen - scheint aber zu erfordern, dass Parent und Child daraufhin angepasst werden (named pipes in beiden Prozessen).
[...]
2013-10-02T13:41:44 murphySoll das ganze jetzt eigentlich portabel auf allen Systemen laufen, oder reicht eine Lösung, die nur auf Windoof arbeitet?
2013-10-02T13:41:11 martin.gIPC::Run habe ich gerade mal unter Windows getestet. Ist der gleiche Käse in grün.
2013-10-02T12:41:10 martin.gNun habe ich mich deutlich intensiver damit auseinandergesetzt, als ich eigentlich vorhatte :-)
2013-10-02T10:25:10 martin.gDas Zurücksetzen des Systems verstehe ich nicht. Meinst Du das Perl Skript abzubrechen? Oder hängt sich durch das Perl Skript der andere Service auf?
2013-10-02T10:25:10 martin.gNachtrag: Deine Ergänzung im Beitrag bzgl. Strg+C lässt darauf schließen, dass Du tatsächlich das Remote System abschießt.
2013-10-02T10:25:10 martin.gWieso das dann aber dreimal funktioniert, ist mir schleierhaft.
2013-10-02T10:25:10 martin.gNachtrag2: Ich habe es begriffen. Du versuchst, Dich irgendwo anzumelden, schaffst es aber nicht, weil Dein Skript nicht funktioniert. Und das System, wo Du Dich anmelden willst, sperrt den Zugang dann.
2013-10-02T10:25:10 martin.gDie Frage, die sich stellt: Das ist eine lokale Anwendung auf Kommadozeilenebene, richtig?
2013-10-02T10:25:10 martin.gWenn Du Dich von Hand nach dem zweiten Mal einmal korrekt einloggst - hast Du dann wieder drei Versuche?
2013-10-02T15:05:34 biancaSag mal, können die dir denn keinen Entwicklerzugang geben, dass es nicht nach drei Fehlversuchen gesperrt ist?Die heutigen Entsperrung hat von halb acht bis vor 30 Minuten auf sich warten lassen (nachdem ich tel. nachgehakt habe), das heißt, ein kompletter Tag ist jeweils futsch bei einer Sperrung.
2013-10-02T15:15:58 GwenDragonSag mal, können die dir denn keinen Entwicklerzugang geben, dass es nicht nach drei Fehlversuchen gesperrt ist?