in reply to open with pipe

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);

Replies are listed 'Best First'.
Re^2: open with pipe
by ikegami (Patriarch) on Aug 01, 2010 at 06:51 UTC
    Use close (implicitly or explicitly) with open, not waitpid.
    $ perl -E' open(my $pipe, "-|", "perl -e'\''sleep 5; exit 3'\''"); say time; close($pipe); say time; say $?>>8; ' 1280645564 1280645569 3
      Sure, close can wait for "-|". But why not waitpid?
      $ perl -E' $pid = open(my $pipe, "-|", "perl -e'\''sleep 5; exit 3'\''"); say time; waitpid($pid, 0); say time; say $?>>8; ' 1280685258 1280685263 3

      waitpid is documented with:

        Waits for a particular child process to terminate and returns the pid of the deceased process, or -1 if there is no such child process.

        The status is returned in $? and ${^CHILD_ERROR_NATIVE}.

        Calling waitpid twice for the same process doesn't seem right to me.