Thread Perl mit Kommandozeilenprogramm kommunizieren (Windows)
(79 answers)
Opened by bianca at 2013-09-10 13:07
Wenn du das ausprobierst, siehst du, dass sehr wohl ein Fehlercode zurück gegeben wird.
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/perl use 5.010; use strict; use warnings; use IPC::Open3; my $cmd = q(P:\Git\bin\ls1.exe); my $pid; $pid = open3( \*CMDIN, \*CMDOUT, \*CMDERR, "$cmd" ); waitpid( $pid, 0 ); ($?>>8) && say "Fehler bei open3 $cmd"; exit; Ein eval eines open3 samt $@ bringt nur einen Fehler, wenn das open3 fehlschlägt, aber nicht wenn das aufrufen des externen Programms im Kindprozess fehlschlägt. Der Fehlercode des forks ist doch in $? drin. Zu der extrem dünnen Doku zu IPC::Open3 ist nur zu sagen, Perl hat nicht umsonst den Ruf unverständlich zu sein, dazu trägt ungenügende Doku bei. Ich kriegs mit IPC::Open3 auch nicht gebacken :( Aus ominösen Gründen klappt unter Windows kein IO::Select->can_read Testcase: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 #!/usr/bin/perl use 5.010; use strict; use warnings; use IO::Select; my $selector = IO::Select->new(); $selector->add(\*STDIN); my @ready; say @ready = $selector->can_read(); Debina 6 x64 test@debby:~$ ./i.pl GLOB(0x1b41410) Win 7 x64 C:\test>i.pl C:\test> Wie soll auch was funktionieren, wenn IO::Select schon nicht klappt wtf.... Siehe auch 651768 von 2007 Unter Windows klappt IO::Select wohl nur mit Sockets. Damit ist das ganze IPC::.... für Windows nicht möglich. Editiert von GwenDragon: Hinweis zu $? und Doku, can_read, IO::Select Testcase geändert, Hinweis PerlMonks Last edited: 2013-09-14 15:18:12 +0200 (CEST) |