use IO::Select; use IPC::Open3; sub createProcess($path) { my $pid = open3(*CMD_IN, *CMD_OUT, *CMD_ERR, $path); my $selector = IO::Select->new(); $selector->add(*CMD_ERR, *CMD_OUT); _parseStreams($selector); close(CMD_IN) or die "Unable to close STDIN: $!"; close(CMD_OUT) or die "Unable to close STDOUT: $!"; close(CMD_ERR) or die "Unable to close STDERR: $!"; waitpid($pid, 0) or die "Waitpid failed: $!"; } sub _parseStreams ($) { my($selector) = @_; my(@ready, $fh, $line); while(@ready = $selector->can_read()) { foreach $fh (@ready) { if(fileno($fh) == fileno(CMD_ERR)) { $line = scalar ; print STDERR $line; } else { $line = scalar ; print STDOUT $line; } $selector->remove($fh) if eof($fh); } } }