=encoding utf8
=head1 NAME
IOMux::Pipe::Read - read from an external command
=head1 INHERITANCE
IOMux::Pipe::Read
is an IOMux::Handler::Read
is an IOMux::Handler
=head1 SYNOPSIS
my $mux = IOMux::Select->new; # or ::Poll
use IOMux::Open '-|';
my $pipe = $mux->open('-|', $command, @cmd_options);
use IOMux::Pipe::Read;
my $pipe = IOMux::Pipe::Read->new
( command => [$command, @cmd_options] );
$mux->add($pipe);
$pipe->getline(sub {print "$_[0]\n"});
=head1 DESCRIPTION
In an event driven program, reading is harder to use than writing: the
read will very probably be stalled until data has arrived, so you will
need a callback to handle the resulting data.
Extends L<"DESCRIPTION" in IOMux::Handler::Read|IOMux::Handler::Read/"DESCRIPTION">.
=head1 METHODS
Extends L<"METHODS" in IOMux::Handler::Read|IOMux::Handler::Read/"METHODS">.
=head2 Constructors
Extends L<"Constructors" in IOMux::Handler::Read|IOMux::Handler::Read/"Constructors">.
=over 4
=item IOMux::Pipe::Read-E<gt>B<bare>(%options)
Creates a pipe, but does not start a process (yet). Used by
L<IOMux::IPC|IOMux::IPC>, which needs three pipes for one process. Returned
is not only a new pipe object, but also a write handle to be
connected to the other side.
All %options which are available to L<IOMux::Handler::Read::new()|IOMux::Handler::Read/"Constructors">
can be used here as well.
-Option --Default
read_size 4096
=over 2
=item read_size => INTEGER
=back
example:
my ($out, $out_rh)
= IOMux::Pipe::Read->bare(name => 'stdout');
=item IOMux::Pipe::Read-E<gt>B<new>(%options)
-Option --Defined in --Default
command <required>
fh IOMux::Handler <required>
name IOMux::Handler '$cmd|'
read_size IOMux::Handler::Read 4096
=over 2
=item command => COMMAND|ARRAY
The external command to be executed. Either the COMMAND needs to
parameters, or you need to pass an ARRAY of the command name and
all its parameters.
=item fh => FILEHANDLE
=item name => STRING
=item read_size => INTEGER
=back
=item IOMux::Pipe::Read-E<gt>B<open>( $mode, <$cmd, $cmdopts>|<$cmdarray, %options> )
Open the pipe to read. $mode is always C<< -| >>. When you need to
pass additional %options to the implied L<new()|IOMux::Pipe::Read/"Constructors">, then you must use
an ARRAY for command name and its optional parameters.
example:
my $mux = IOMux::Poll->new;
$mux->open('-|', 'who', '-H'); # no opts
$mux->open('-|', ['who', '-H'], %opts);
$mux->open('-|', 'who'); # no opts
$mux->open('-|', ['who'], %opts);
=back
=head2 Accessors
Extends L<"Accessors" in IOMux::Handler::Read|IOMux::Handler::Read/"Accessors">.
=over 4
=item $obj-E<gt>B<childPid>()
The process id of the child on the other side of the pipe.
=item $obj-E<gt>B<fh>()
Inherited, see L<IOMux::Handler/"Accessors">
=item $obj-E<gt>B<fileno>()
Inherited, see L<IOMux::Handler/"Accessors">
=item $obj-E<gt>B<mode>()
The bits of the open mode.
=item $obj-E<gt>B<mux>()
Inherited, see L<IOMux::Handler/"Accessors">
=item $obj-E<gt>B<name>()
Inherited, see L<IOMux::Handler/"Accessors">
=item $obj-E<gt>B<readSize>( [$integer] )
Inherited, see L<IOMux::Handler::Read/"Accessors">
=item $obj-E<gt>B<usesSSL>()
Inherited, see L<IOMux::Handler/"Accessors">
=back
=head2 User interface
Extends L<"User interface" in IOMux::Handler::Read|IOMux::Handler::Read/"User interface">.
=head2 Multiplexer
Extends L<"Multiplexer" in IOMux::Handler::Read|IOMux::Handler::Read/"Multiplexer">.
=head2 Helpers
Extends L<"Helpers" in IOMux::Handler::Read|IOMux::Handler::Read/"Helpers">.
=over 4
=item $obj-E<gt>B<extractSocket>(HASH)
=item IOMux::Pipe::Read-E<gt>B<extractSocket>(HASH)
Inherited, see L<IOMux::Handler/"Helpers">
=item $obj-E<gt>B<fdset>($state, $read, $write, $error)
Inherited, see L<IOMux::Handler/"Helpers">
=item $obj-E<gt>B<show>()
Inherited, see L<IOMux::Handler/"Helpers">
=back
=head1 SEE ALSO
This module is part of IOMux distribution version 1.01,
built on January 15, 2020. Website: F<http://perl.overmeer.net/CPAN>
=head1 LICENSE
Copyrights 2011-2020 by [Mark Overmeer <markov@cpan.org>]. For other contributors see ChangeLog.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
See F<http://dev.perl.org/licenses/>