Fix:
#!/usr/bin/perl use strict; use warnings; use IO::Select (); use IPC::Open3 qw( open3 ); $|++; my $BLOCK_SIZE = 1024; my $script = shift; my $pid = open3(undef, \*OUT, \*ERR, "./$script @ARGV"); my $r_sel = IO::Select->new(\*OUT, \*ERR); my $out = ''; my $err = ''; MAIN_LOOP: for (;;) { my @r = $r_sel->can_read(); foreach (@r) { last MAIN_LOOP if eof($_); my $dp = ($_ == \*OUT ? \$out : \$err); 1 while read($_, $$dp, $BLOCK_SIZE, length($$dp)); } } waitpid($pid, 0); # Reap child. print("STDOUT: $out\n"); print("STDERR: $err\n");
Tested.
It gets more complex if you have multiple children, or if you do bidirectional communication. Refer to Using 'select' to handle multiple sockets to do those things.
I think you can use -s $_ instead of $BLOCK_SIZE on linux (thus eliminating the need for the while loop), but it doesn't work on other OSes such as FreeBSD.
In reply to Re: Script hangs when called via IPC::Open3 (Solution)
by ikegami
in thread Script hangs when called via IPC::Open3
by jeffa
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |