@node IPC/Open2, IPC/Open3, IO/Socket, Module List
@unnumbered open a process for both reading and writing


@unnumberedsec NAME

IPC::Open2, open2 - open a process for both reading and writing

@unnumberedsec SYNOPSIS

@example
use IPC::Open2;
$pid = open2(\*RDR, \*WTR, @'some cmd and args@');
  # or
$pid = open2(\*RDR, \*WTR, @'some@', @'cmd@', @'and@', @'args@');
@end example

@unnumberedsec DESCRIPTION

The open2() function spawns the given $cmd and connects $rdr for
reading and $wtr for writing.  It@'s what you think should work 
when you try

@example
open(HANDLE, "|cmd args|");
@end example

open2() returns the process ID of the child process.  It doesn@'t return on
failure: it just raises an exception matching @code{/^open2:/}.

@unnumberedsec WARNING 

It will not create these file handles for you.  You have to do this yourself.
So don@'t pass it empty variables expecting them to get filled in for you.

Additionally, this is very dangerous as you may block forever.
It assumes it@'s going to talk to something like @strong{bc}, both writing to
it and reading from it.  This is presumably safe because you "know"
that commands like @strong{bc} will read a line at a time and output a line at
a time.  Programs like sort that read their entire input stream first,
however, are quite apt to cause deadlock.  

The big problem with this approach is that if you don@'t have control 
over source code being run in the the child process, you can@'t control what it does 
with pipe buffering.  Thus you can@'t just open a pipe to @code{cat -v} and continually
read and write a line from it.

@unnumberedsec SEE ALSO

See @samp{open3} in this node for an alternative that handles STDERR as well.

