# RETURNS: ( $stdout, $stderr ) Both are refs to an array of lines.
sub OSexecute {
my @execute = @_;
local $, = ' '; # for print "...@execute..."
my $debug = 0;
#$debug = 1;
print("OSexecute(@execute)\n") if ($debug);
# Here is the actual execution.
my $pid = eval { open3($din, $dout, $derr, @execute) };
die "OSexecute(@execute): $@" if ($@);
# Wait for process to complete.
waitpid($pid, 0);
# Gather the results
my @stdout = <$dout>;
my @stderr = <$derr>;
# We should check the return code of the child.
# Gotta trap SIGPIPE for that.
return ( \@stdout, \@stderr );
}
####
{
my $file_name;
foreach $file_name ('c:\\tinyfile.txt', 'c:\\biggfile.txt') {
my ($stdout, $stderr);
print("$file_name\n", ("=" x length($file_name))."\n", "\n");
($stdout, $stderr)
= OSexecute('cmd.exe', '/c', 'type', "\"$file_name\"");
print("stdout\n", "------\n", @$stdout);
print("Nothing was sent to STDOUT.\n") unless (@$stdout);
print("\n");
print("stderr\n", "------\n", @$stderr);
print("Nothing was sent to STDERR.\n") unless (@$stderr);
print("\n", "\n");
}
}
####
c:\tinyfile.txt
===============
stdout
------
foo
bar
bla
stderr
------
Nothing was sent to STDERR.
c:\biggfile.txt
===============
*** HANGS ***
####
# RETURNS: ( $stdout, $stderr ) Both are refs to an array of lines.
sub OSexecute {
my @execute = @_;
my @stdout;
my @stderr;
local $, = ' '; # for print "...@execute..."
my $debug = 0;
#$debug = 1;
print("OSexecute(@execute)\n") if ($debug);
# Here is the actual execution.
my $pid = eval { open3($din, $dout, $derr, @execute) };
die "OSexecute(@execute): $@" if ($@);
my $select = IO::Select->new();
$select->add($dout);
$select->add($derr);
my @ready;
my $fh;
# Gather the results
while (@ready = $select->can_read()) {
foreach $fh (@ready) {
push(@stdout, <$fh>) if ($fh == $dout);
push(@stderr, <$fh>) if ($fh == $derr);
}
}
# Wait for process to complete and reap it.
waitpid($pid, 0);
# We should check the return code of the child.
# Gotta trap SIGPIPE for that.
return ( \@stdout, \@stderr );
}