Given:
my $child_pid = open( my $out, "-|", "some command" );
The parent process opens a read filehandle
$out from the child/command's STDOUT. This statement is non-blocking, as you observed. Note that if
$child_pid is undefined, the command execution failed.
If the child writes a lot to STDOUT, the
child will eventually
block when the pipe between the parent & child is full. It is up to the parent process to read data off from the pipe (read
$out) so that the child may
unblock to write more.
However, merely reading from
$out does not
guarantee that the parent will "wait" for the command to finish. The child process could still be doing something else after it's last write to STDOUT, or even closing its STDOUT prior to doing more.
To really
wait for the command to finish:
waitpid($child_pid, 0);