use Library;
$| = 1;
Library::createProcess('second application');
####
use Library;
select((select(STDOUT), $|=1)[0]);
print STDOUT "Out \n";
print STDERR " -> Err \n";
print STDOUT "Out \n";
print STDERR " -> Err \n";
print STDOUT "Out \n";
print STDERR " -> Err \n";
Library::createProcess('random application');
####
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);
}
}
}
####
Out
Out
Out
-> Err
-> Err
-> Err