Several of the perl IPC::Open2 examples seem incomplete, including perldoc (which waitpid's on a process with open file descriptors) and a gnuplot example (which assumes gnuplot exit'd). Below is a complete perl IPC::Open2 example that interfaces with mysql (yes, it's contrived; you should be using DBI ;).
sub mysql($) { my ($argv) = @_; my $cmd = sprintf "mysql --batch --raw -A -u %s --password=%s -h %s %s", $argv->{'user'}, $argv->{'password'}, $argv->{'host'}, $argv->{'db'}; my ($child_stdin, $child_stdout); my $pid = IPC::Open2::open2($child_stdout, $child_stdin, $cmd); return sub { my ($query) = @_; print $child_stdin $query; close $child_stdin; my $discard_header = <$child_stdout>; my @ret = map { s/\r?\n$//; $_ } <$child_stdout>; close $child_stdout; kill 9, $pid; waitpid $pid, 0; return \@ret; }; } my $two = mysql( { user=> 'root', ... } )->('select 1+1')->[0];