summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/IPC/Run3.pm
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/IPC/Run3.pm')
-rw-r--r--chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/IPC/Run3.pm814
1 files changed, 0 insertions, 814 deletions
diff --git a/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/IPC/Run3.pm b/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/IPC/Run3.pm
deleted file mode 100644
index 47712f4d0b4..00000000000
--- a/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/IPC/Run3.pm
+++ /dev/null
@@ -1,814 +0,0 @@
-package IPC::Run3;
-
-=head1 NAME
-
-IPC::Run3 - run a subprocess with input/ouput redirection
-
-=head1 VERSION
-
-version 0.040
-
-=cut
-
-$VERSION = '0.040';
-
-=head1 SYNOPSIS
-
- use IPC::Run3; # Exports run3() by default
-
- run3 \@cmd, \$in, \$out, \$err;
-
-=head1 DESCRIPTION
-
-This module allows you to run a subprocess and redirect stdin, stdout,
-and/or stderr to files and perl data structures. It aims to satisfy 99% of the
-need for using C<system>, C<qx>, and C<open3>
-with a simple, extremely Perlish API.
-
-Speed, simplicity, and portability are paramount. (That's speed of Perl code;
-which is often much slower than the kind of buffered I/O that this module uses
-to spool input to and output from the child command.)
-
-=cut
-
-use 5.006_000; # i.e. v5.6.0
-
-@EXPORT = qw( run3 );
-%EXPORT_TAGS = ( all => \@EXPORT );
-@ISA = qw( Exporter );
-use Exporter;
-
-use strict;
-use constant debugging => $ENV{IPCRUN3DEBUG} || $ENV{IPCRUNDEBUG} || 0;
-use constant profiling => $ENV{IPCRUN3PROFILE} || $ENV{IPCRUNPROFILE} || 0;
-use constant is_win32 => 0 <= index $^O, "Win32";
-
-BEGIN {
- if ( is_win32 ) {
- eval "use Win32 qw( GetOSName ); 1" or die $@;
- }
-}
-
-#use constant is_win2k => is_win32 && GetOSName() =~ /Win2000/i;
-#use constant is_winXP => is_win32 && GetOSName() =~ /WinXP/i;
-
-use Carp qw( croak );
-use File::Temp qw( tempfile );
-use POSIX qw( dup dup2 );
-
-# We cache the handles of our temp files in order to
-# keep from having to incur the (largish) overhead of File::Temp
-my %fh_cache;
-my $fh_cache_pid = $$;
-
-my $profiler;
-
-sub _profiler { $profiler } # test suite access
-
-BEGIN {
- if ( profiling ) {
- eval "use Time::HiRes qw( gettimeofday ); 1" or die $@;
- if ( $ENV{IPCRUN3PROFILE} =~ /\A\d+\z/ ) {
- require IPC::Run3::ProfPP;
- IPC::Run3::ProfPP->import;
- $profiler = IPC::Run3::ProfPP->new(Level => $ENV{IPCRUN3PROFILE});
- } else {
- my ( $dest, undef, $class ) =
- reverse split /(=)/, $ENV{IPCRUN3PROFILE}, 2;
- $class = "IPC::Run3::ProfLogger"
- unless defined $class && length $class;
- if ( not eval "require $class" ) {
- my $e = $@;
- $class = "IPC::Run3::$class";
- eval "require IPC::Run3::$class" or die $e;
- }
- $profiler = $class->new( Destination => $dest );
- }
- $profiler->app_call( [ $0, @ARGV ], scalar gettimeofday() );
- }
-}
-
-
-END {
- $profiler->app_exit( scalar gettimeofday() ) if profiling;
-}
-
-sub _spool_data_to_child {
- my ( $type, $source, $binmode_it ) = @_;
-
- # If undef (not \undef) passed, they want the child to inherit
- # the parent's STDIN.
- return undef unless defined $source;
- warn "binmode()ing STDIN\n" if is_win32 && debugging && $binmode_it;
-
- my $fh;
- if ( ! $type ) {
- open $fh, "<", $source or croak "$!: $source";
- if ( is_win32 ) {
- binmode $fh, ":raw"; # Remove all layers
- binmode $fh, ":crlf" unless $binmode_it;
- }
- warn "run3(): feeding file '$source' to child STDIN\n"
- if debugging >= 2;
- } elsif ( $type eq "FH" ) {
- $fh = $source;
- warn "run3(): feeding filehandle '$source' to child STDIN\n"
- if debugging >= 2;
- } else {
- $fh = $fh_cache{in} ||= tempfile;
- truncate $fh, 0;
- seek $fh, 0, 0;
- if ( is_win32 ) {
- binmode $fh, ":raw"; # Remove any previous layers
- binmode $fh, ":crlf" unless $binmode_it;
- }
- my $seekit;
- if ( $type eq "SCALAR" ) {
-
- # When the run3()'s caller asks to feed an empty file
- # to the child's stdin, we want to pass a live file
- # descriptor to an empty file (like /dev/null) so that
- # they don't get surprised by invalid fd errors and get
- # normal EOF behaviors.
- return $fh unless defined $$source; # \undef passed
-
- warn "run3(): feeding SCALAR to child STDIN",
- debugging >= 3
- ? ( ": '", $$source, "' (", length $$source, " chars)" )
- : (),
- "\n"
- if debugging >= 2;
-
- $seekit = length $$source;
- print $fh $$source or die "$! writing to temp file";
-
- } elsif ( $type eq "ARRAY" ) {
- warn "run3(): feeding ARRAY to child STDIN",
- debugging >= 3 ? ( ": '", @$source, "'" ) : (),
- "\n"
- if debugging >= 2;
-
- print $fh @$source or die "$! writing to temp file";
- $seekit = grep length, @$source;
- } elsif ( $type eq "CODE" ) {
- warn "run3(): feeding output of CODE ref '$source' to child STDIN\n"
- if debugging >= 2;
- my $parms = []; # TODO: get these from $options
- while (1) {
- my $data = $source->( @$parms );
- last unless defined $data;
- print $fh $data or die "$! writing to temp file";
- $seekit = length $data;
- }
- }
-
- seek $fh, 0, 0 or croak "$! seeking on temp file for child's stdin"
- if $seekit;
- }
-
- croak "run3() can't redirect $type to child stdin"
- unless defined $fh;
-
- return $fh;
-}
-
-sub _fh_for_child_output {
- my ( $what, $type, $dest, $options ) = @_;
-
- my $fh;
- if ( $type eq "SCALAR" && $dest == \undef ) {
- warn "run3(): redirecting child $what to oblivion\n"
- if debugging >= 2;
-
- $fh = $fh_cache{nul} ||= do {
- open $fh, ">", File::Spec->devnull;
- $fh;
- };
- } elsif ( $type eq "FH" ) {
- $fh = $dest;
- warn "run3(): redirecting $what to filehandle '$dest'\n"
- if debugging >= 3;
- } elsif ( !$type ) {
- warn "run3(): feeding child $what to file '$dest'\n"
- if debugging >= 2;
-
- open $fh, $options->{"append_$what"} ? ">>" : ">", $dest
- or croak "$!: $dest";
- } else {
- warn "run3(): capturing child $what\n"
- if debugging >= 2;
-
- $fh = $fh_cache{$what} ||= tempfile;
- seek $fh, 0, 0;
- truncate $fh, 0;
- }
-
- if ( is_win32 ) {
- warn "binmode()ing $what\n" if debugging && $options->{"binmode_$what"};
- binmode $fh, ":raw";
- binmode $fh, ":crlf" unless $options->{"binmode_$what"};
- }
- return $fh;
-}
-
-sub _read_child_output_fh {
- my ( $what, $type, $dest, $fh, $options ) = @_;
-
- return if $type eq "SCALAR" && $dest == \undef;
-
- seek $fh, 0, 0 or croak "$! seeking on temp file for child $what";
-
- if ( $type eq "SCALAR" ) {
- warn "run3(): reading child $what to SCALAR\n"
- if debugging >= 3;
-
- # two read()s are used instead of 1 so that the first will be
- # logged even it reads 0 bytes; the second won't.
- my $count = read $fh, $$dest, 10_000,
- $options->{"append_$what"} ? length $$dest : 0;
- while (1) {
- croak "$! reading child $what from temp file"
- unless defined $count;
-
- last unless $count;
-
- warn "run3(): read $count bytes from child $what",
- debugging >= 3 ? ( ": '", substr( $$dest, -$count ), "'" ) : (),
- "\n"
- if debugging >= 2;
-
- $count = read $fh, $$dest, 10_000, length $$dest;
- }
- } elsif ( $type eq "ARRAY" ) {
- if ($options->{"append_$what"}) {
- push @$dest, <$fh>;
- } else {
- @$dest = <$fh>;
- }
- if ( debugging >= 2 ) {
- my $count = 0;
- $count += length for @$dest;
- warn
- "run3(): read ",
- scalar @$dest,
- " records, $count bytes from child $what",
- debugging >= 3 ? ( ": '", @$dest, "'" ) : (),
- "\n";
- }
- } elsif ( $type eq "CODE" ) {
- warn "run3(): capturing child $what to CODE ref\n"
- if debugging >= 3;
-
- local $_;
- while ( <$fh> ) {
- warn
- "run3(): read ",
- length,
- " bytes from child $what",
- debugging >= 3 ? ( ": '", $_, "'" ) : (),
- "\n"
- if debugging >= 2;
-
- $dest->( $_ );
- }
- } else {
- croak "run3() can't redirect child $what to a $type";
- }
-
-}
-
-sub _type {
- my ( $redir ) = @_;
- return "FH" if eval { $redir->isa("IO::Handle") };
- my $type = ref $redir;
- return $type eq "GLOB" ? "FH" : $type;
-}
-
-sub _max_fd {
- my $fd = dup(0);
- POSIX::close $fd;
- return $fd;
-}
-
-my $run_call_time;
-my $sys_call_time;
-my $sys_exit_time;
-
-sub run3 {
- $run_call_time = gettimeofday() if profiling;
-
- my $options = @_ && ref $_[-1] eq "HASH" ? pop : {};
-
- my ( $cmd, $stdin, $stdout, $stderr ) = @_;
-
- print STDERR "run3(): running ",
- join( " ", map "'$_'", ref $cmd ? @$cmd : $cmd ),
- "\n"
- if debugging;
-
- if ( ref $cmd ) {
- croak "run3(): empty command" unless @$cmd;
- croak "run3(): undefined command" unless defined $cmd->[0];
- croak "run3(): command name ('')" unless length $cmd->[0];
- } else {
- croak "run3(): missing command" unless @_;
- croak "run3(): undefined command" unless defined $cmd;
- croak "run3(): command ('')" unless length $cmd;
- }
-
- my $in_type = _type $stdin;
- my $out_type = _type $stdout;
- my $err_type = _type $stderr;
-
- if ($fh_cache_pid != $$) {
- # fork detected, close all cached filehandles and clear the cache
- close $_ foreach values %fh_cache;
- %fh_cache = ();
- $fh_cache_pid = $$;
- }
-
- # This routine procedes in stages so that a failure in an early
- # stage prevents later stages from running, and thus from needing
- # cleanup.
-
- my $in_fh = _spool_data_to_child $in_type, $stdin,
- $options->{binmode_stdin} if defined $stdin;
-
- my $out_fh = _fh_for_child_output "stdout", $out_type, $stdout,
- $options if defined $stdout;
-
- my $tie_err_to_out =
- defined $stderr && defined $stdout && $stderr eq $stdout;
-
- my $err_fh = $tie_err_to_out
- ? $out_fh
- : _fh_for_child_output "stderr", $err_type, $stderr,
- $options if defined $stderr;
-
- # this should make perl close these on exceptions
- local *STDIN_SAVE;
- local *STDOUT_SAVE;
- local *STDERR_SAVE;
-
- my $saved_fd0 = dup( 0 ) if defined $in_fh;
-
-# open STDIN_SAVE, "<&STDIN"# or croak "run3(): $! saving STDIN"
-# if defined $in_fh;
- open STDOUT_SAVE, ">&STDOUT" or croak "run3(): $! saving STDOUT"
- if defined $out_fh;
- open STDERR_SAVE, ">&STDERR" or croak "run3(): $! saving STDERR"
- if defined $err_fh;
-
- my $ok = eval {
- # The open() call here seems to not force fd 0 in some cases;
- # I ran in to trouble when using this in VCP, not sure why.
- # the dup2() seems to work.
- dup2( fileno $in_fh, 0 )
-# open STDIN, "<&=" . fileno $in_fh
- or croak "run3(): $! redirecting STDIN"
- if defined $in_fh;
-
-# close $in_fh or croak "$! closing STDIN temp file"
-# if ref $stdin;
-
- open STDOUT, ">&" . fileno $out_fh
- or croak "run3(): $! redirecting STDOUT"
- if defined $out_fh;
-
- open STDERR, ">&" . fileno $err_fh
- or croak "run3(): $! redirecting STDERR"
- if defined $err_fh;
-
- $sys_call_time = gettimeofday() if profiling;
-
- my $r = ref $cmd
- ? system { $cmd->[0] }
- is_win32
- ? map {
- # Probably need to offer a win32 escaping
- # option, every command may be different.
- ( my $s = $_ ) =~ s/"/"""/g;
- $s = qq{"$s"};
- $s;
- } @$cmd
- : @$cmd
- : system $cmd;
-
- $sys_exit_time = gettimeofday() if profiling;
-
- unless ( defined $r && $r != -1 ) {
- if ( debugging ) {
- my $err_fh = defined $err_fh ? \*STDERR_SAVE : \*STDERR;
- print $err_fh "run3(): system() error $!\n"
- }
- die $!;
- }
-
- if ( debugging ) {
- my $err_fh = defined $err_fh ? \*STDERR_SAVE : \*STDERR;
- print $err_fh "run3(): \$? is $?\n"
- }
- 1;
- };
- my $x = $@;
-
- my @errs;
-
- if ( defined $saved_fd0 ) {
- dup2( $saved_fd0, 0 );
- POSIX::close( $saved_fd0 );
- }
-
-# open STDIN, "<&STDIN_SAVE"# or push @errs, "run3(): $! restoring STDIN"
-# if defined $in_fh;
- open STDOUT, ">&STDOUT_SAVE" or push @errs, "run3(): $! restoring STDOUT"
- if defined $out_fh;
- open STDERR, ">&STDERR_SAVE" or push @errs, "run3(): $! restoring STDERR"
- if defined $err_fh;
-
- croak join ", ", @errs if @errs;
-
- die $x unless $ok;
-
- _read_child_output_fh "stdout", $out_type, $stdout, $out_fh, $options
- if defined $out_fh && $out_type && $out_type ne "FH";
- _read_child_output_fh "stderr", $err_type, $stderr, $err_fh, $options
- if defined $err_fh && $err_type && $err_type ne "FH" && !$tie_err_to_out;
- $profiler->run_exit(
- $cmd,
- $run_call_time,
- $sys_call_time,
- $sys_exit_time,
- scalar gettimeofday()
- ) if profiling;
-
- return 1;
-}
-
-1;
-
-__END__
-
-=head2 C<< run3($cmd, $stdin, $stdout, $stderr, \%options) >>
-
-All parameters after C<$cmd> are optional.
-
-The parameters C<$stdin>, C<$stdout> and C<$stderr> indicate
-how the child's corresponding filehandle
-(C<STDIN>, C<STDOUT> and C<STDERR>, resp.) will be redirected.
-Because the redirects come last, this allows C<STDOUT> and C<STDERR> to default
-to the parent's by just not specifying them -- a common use case.
-
-C<run3> returns true if the command executes and throws an exception otherwise.
-It leaves C<$?> intact for inspection of exit and wait status.
-
-=head3 C<$cmd>
-
-Usually C<$cmd> will be an ARRAY reference and the child is invoked via
-
- system @$cmd;
-
-But C<$cmd> may also be a string in which case the child is invoked via
-
- system $cmd;
-
-(cf. L<perlfunc/system> for the difference and the pitfalls of using
-the latter form).
-
-=head3 C<$stdin>, C<$stdout>, C<$stderr>
-
-The parameters C<$stdin>, C<$stdout> and C<$stderr>
-can take one of the following forms:
-
-=over 4
-
-=item C<undef> (or not specified at all)
-
-The child inherits the corresponding filehandle from the parent.
-
- run3 \@cmd, $stdin; # child writes to same STDOUT and STDERR as parent
- run3 \@cmd, undef, $stdout, $stderr; # child reads from same STDIN as parent
-
-=item C<\undef>
-
-The child's filehandle is redirected from or to the
-local equivalent of C</dev/null> (as returned by
-C<< File::Spec->devnull() >>).
-
- run3 \@cmd, \undef, $stdout, $stderr; # child reads from /dev/null
-
-=item a simple scalar
-
-The parameter is taken to be the name of a file to read from
-or write to. In the latter case, the file will be opened via
-
- open FH, ">", ...
-
-i.e. it is created if it doesn't exist and truncated otherwise.
-Note that the file is opened by the parent which will L<croak|Carp/croak>
-in case of failure.
-
- run3 \@cmd, \undef, "out.txt"; # child writes to file "out.txt"
-
-=item a filehandle (either a reference to a GLOB or an C<IO::Handle>)
-
-The filehandle is inherited by the child.
-
- open my $fh, ">", "out.txt";
- print $fh "prologue\n";
- ...
- run3 \@cmd, \undef, $fh; # child writes to $fh
- ...
- print $fh "epilogue\n";
- close $fh;
-
-=item a SCALAR reference
-
-The referenced scalar is treated as a string to be read from or
-written to. In the latter case, the previous content of the string
-is overwritten.
-
- my $out;
- run3 \@cmd, \undef, \$out; # child writes into string
- run3 \@cmd, \<<EOF; # child reads from string (can use "here" notation)
- Input
- to
- child
- EOF
-
-=item an ARRAY reference
-
-For C<$stdin>, the elements of C<@$stdin> are simply spooled to the child.
-
-For C<$stdout> or C<$stderr>, the child's corresponding file descriptor
-is read line by line (as determined by the current setting of C<$/>)
-into C<@$stdout> or C<@$stderr>, resp. The previous content of the array
-is overwritten.
-
- my @lines;
- run3 \@cmd, \undef, \@lines; # child writes into array
-
-=item a CODE reference
-
-For C<$stdin>, C<&$stdin> will be called repeatedly (with no arguments) and
-the return values are spooled to the child. C<&$stdin> must signal the end of
-input by returning C<undef>.
-
-For C<$stdout> or C<$stderr>, the child's corresponding file descriptor
-is read line by line (as determined by the current setting of C<$/>)
-and C<&$stdout> or C<&$stderr>, resp., is called with the contents of the line.
-Note that there's no end-of-file indication.
-
- my $i = 0;
- sub producer {
- return $i < 10 ? "line".$i++."\n" : undef;
- }
-
- run3 \@cmd, \&producer; # child reads 10 lines
-
-Note that this form of redirecting the child's I/O doesn't imply
-any form of concurrency between parent and child - run3()'s method of
-operation is the same no matter which form of redirection you specify.
-
-=back
-
-If the same value is passed for C<$stdout> and C<$stderr>, then the child
-will write both C<STDOUT> and C<STDERR> to the same filehandle.
-In general, this means that
-
- run3 \@cmd, \undef, "foo.txt", "foo.txt";
- run3 \@cmd, \undef, \$both, \$both;
-
-will DWIM and pass a single file handle to the child for both C<STDOUT> and
-C<STDERR>, collecting all into file "foo.txt" or C<$both>.
-
-=head3 C<\%options>
-
-The last parameter, C<\%options>, must be a hash reference if present.
-
-Currently the following
-keys are supported:
-
-=over 4
-
-=item C<binmode_stdin>, C<binmode_stdout>, C<binmode_stderr>
-
-If their value is true then the corresponding
-parameter C<$stdin>, C<$stdout> or C<$stderr>, resp., operates
-in "binary" mode (cf. L<perlfunc/binmode>).
-The default is to operate in "text" mode.
-(This is only relevant for platforms where these modes differ.)
-
-=item C<append_stdout>, C<append_stderr>
-
-If their value is true then the corresponding
-parameter C<$stdout> or C<$stderr>, resp., will append the child's output
-to the existing "contents" of the redirector. This only makes
-sense if the redirector is a simple scalar (the corresponding file
-is opened in append mode), a SCALAR reference (the output is
-appended to the previous contents of the string)
-or an ARRAY reference (the output is C<push>ed onto the
-previous contents of the array).
-
-=back
-
-=head1 HOW IT WORKS
-
-=over 4
-
-=item (1)
-
-For each redirector C<$stdin>, C<$stdout>, and C<$stderr>,
-C<run3()> furnishes a filehandle:
-
-=over 4
-
-=item *
-
-if the redirector already specifies a filehandle it just uses that
-
-=item *
-
-if the redirector specifies a filename, C<run3()> opens the file
-in the appropriate mode
-
-=item *
-
-in all other cases, C<run3()> opens a temporary file
-(using L<tempfile|Temp/tempfile>)
-
-=back
-
-=item (2)
-
-If C<run3()> opened a temporary file for C<$stdin> in step (1),
-it writes the data using the specified method (either
-from a string, an array or returnd by a function) to the temporary file and rewinds it.
-
-=item (3)
-
-C<run3()> saves the parent's C<STDIN>, C<STDOUT> and C<STDERR> by duplicating
-them to new filehandles. It duplicates the filehandles from step (1)
-to C<STDIN>, C<STDOUT> and C<STDERR>, resp.
-
-=item (4)
-
-C<run3()> runs the child by invoking L<system|perlfunc/system>
-with C<$cmd> as specified above.
-
-=item (5)
-
-C<run3()> restores the parent's C<STDIN>, C<STDOUT> and C<STDERR> saved in step (3).
-
-=item (6)
-
-If C<run3()> opened a temporary file for C<$stdout> or C<$stderr> in step (1),
-it rewinds it and reads back its contents using the specified method
-(either to a string, an array or by calling a function).
-
-=item (7)
-
-C<run3()> closes all filehandles that it opened explicitly in step (1).
-
-=back
-
-Note that when using temporary files, C<run3()> tries to amortize the overhead
-by reusing them (i.e. it keeps them open and rewinds and truncates them
-before the next operation).
-
-=head1 LIMITATIONS
-
-Often uses intermediate files (determined by File::Temp, and thus by the
-File::Spec defaults and the TMPDIR env. variable) for speed, portability and
-simplicity.
-
-Use extrem caution when using C<run3> in a threaded environment if
-concurrent calls of C<run3> are possible. Most likely, I/O from different
-invocations will get mixed up. The reason is that in most thread
-implementations all threads in a process share the same STDIN/STDOUT/STDERR.
-Known failures are Perl ithreads on Linux and Win32. Note that C<fork>
-on Win32 is emulated via Win32 threads and hence I/O mix up is possible
-between forked children here (C<run3> is "fork safe" on Unix, though).
-
-=head1 DEBUGGING
-
-To enable debugging use the IPCRUN3DEBUG environment variable to
-a non-zero integer value:
-
- $ IPCRUN3DEBUG=1 myapp
-
-=head1 PROFILING
-
-To enable profiling, set IPCRUN3PROFILE to a number to enable emitting profile
-information to STDERR (1 to get timestamps, 2 to get a summary report at the
-END of the program, 3 to get mini reports after each run) or to a filename to
-emit raw data to a file for later analysis.
-
-=head1 COMPARISON
-
-Here's how it stacks up to existing APIs:
-
-=head2 compared to C<system()>, C<qx''>, C<open "...|">, C<open "|...">
-
-=over
-
-=item +
-
-redirects more than one file descriptor
-
-=item +
-
-returns TRUE on success, FALSE on failure
-
-=item +
-
-throws an error if problems occur in the parent process (or the pre-exec child)
-
-=item +
-
-allows a very perlish interface to Perl data structures and subroutines
-
-=item +
-
-allows 1 word invocations to avoid the shell easily:
-
- run3 ["foo"]; # does not invoke shell
-
-=item -
-
-does not return the exit code, leaves it in $?
-
-=back
-
-=head2 compared to C<open2()>, C<open3()>
-
-=over
-
-=item +
-
-no lengthy, error prone polling/select loop needed
-
-=item +
-
-hides OS dependancies
-
-=item +
-
-allows SCALAR, ARRAY, and CODE references to source and sink I/O
-
-=item +
-
-I/O parameter order is like C<open3()> (not like C<open2()>).
-
-=item -
-
-does not allow interaction with the subprocess
-
-=back
-
-=head2 compared to L<IPC::Run::run()|IPC::Run/run>
-
-=over
-
-=item +
-
-smaller, lower overhead, simpler, more portable
-
-=item +
-
-no select() loop portability issues
-
-=item +
-
-does not fall prey to Perl closure leaks
-
-=item -
-
-does not allow interaction with the subprocess (which
-IPC::Run::run() allows by redirecting subroutines)
-
-=item -
-
-lacks many features of C<IPC::Run::run()> (filters, pipes,
-redirects, pty support)
-
-=back
-
-=head1 COPYRIGHT
-
-Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved
-
-=head1 LICENSE
-
-You may use this module under the terms of the BSD, Artistic, or GPL licenses,
-any version.
-
-=head1 AUTHOR
-
-Barrie Slaymaker E<lt>C<barries@slaysys.com>E<gt>
-
-Ricardo SIGNES E<lt>C<rjbs@cpan.org>E<gt> performed some routine maintenance in
-2005, thanks to help from the following ticket and/or patch submitters: Jody
-Belka, Roderich Schupp, David Morel, and anonymous others.
-
-=cut