in reply to Unexpected termination on "print"

the exit value after termination is 141, which means nothing to me.

Then perhaps you should read about $? ?

If I change the print statement to print {$proc->st­din} "text\n" the it appears as if perl tries to run the statement twice!

No, it is just that in print {$proc->stdin} "text\n" there are two statements in that one line. The braces actually constitute a block and so $proc->stdin is a full statement, not just an expression. So the debugger stops for that statement first and then stops for the print statement after that.

But back to your primary question. The reason printing to a pipe usually causes a process to exit is because all readers of that pipe have now closed their handle (usually because they have exit()ed) and so the writing process gets sent SIGPIPE. This behavior should be mentioned briefly in "man 2 write" and should be covered more extensively by "man 7 pipe".

And your exit value confirms that this is the cause in your specific case.

- tye        

Replies are listed 'Best First'.
Re^2: Unexpected termination on "print" (pipe)
by mlawren (Sexton) on Aug 14, 2015 at 20:35 UTC

    Thanks for your reply tye. Much appreciated, especially given how deep these nodes get pushed with all the questions coming through.

    I know in principle what $? is used for, but I could not find (nor does the documentation you point to) a list matching perl exit codes (or are they system error codes?) with reasons. Should I be looking at something like errno.h?

    However your pointer to SIGPIPE was spot on. Installing a handler allowed me to deal with the error and continue execution.

    Thanks again.

      Should I be looking at something like errno.h?

      No, you should be reading the documentation that I already linked to: $?.

      - tye        

        Hmm... perhaps you think I didn't read the documentation you linked to? I did, twice, but that didn't get me very far. Which either says something about my comprehension, or the quality of the documentation.

        $? is a perl variable. Presumably, in the case we are discussing, print/write to a closed pipe results in $? being set, and presumably that is also what perl ends up passing back to the shell, which shifts it by 8 and eventually I end up seeing it as an integer.

        How does the documentation for $? supposed to get me from the number 141 back to SIGPIPE?

        update: So it turns out the shell exit code is $? directly, and not shifted like I thought. Hence:

        141 >> 8 = 0 141 & 127 = 13 141 & 128 = 128
        And now I see that I have something I can look up in signum.h.