Dear Monks,

Do pipes add a layer of buffering? Here is a simple program:

2perl.pl:
#!/usr/bin/env perl use strict; use warnings; use 5.010; say 'hello'; say 'I need a rest. Sleeping...'; sleep 10;

When I run that program, I see two lines of output, and then the program hangs while it sleeps.

The docs say this about open():

If the filename begins with '|', the filename is interpreted as a command to which output is to be piped, and if the filename ends with a '|', the filename is interpreted as a command which pipes output to us.

Here is a program that executes the previous program:

open (my $INFILE, '2perl.pl |') or die "couldn't start program: $!"; while (<$INFILE>) { print; } close $INFILE;

In this case, the program hangs immediately, and it's only after the first program finishes sleeping(and executing) that any output is displayed. Therefore, it seems like the pipe is adding buffering to a program that was originally unbuffered.

However, if I add the following line to the first program:

$| = 1;

then run the second program, the output from the first program is immediately displayed and then the program hangs. That result makes it seem like the first program buffers by default, and the $|=1 turns off the buffering.

So how do you explain that apparent contradiction? Why do I need to set $| to 1 when the original program didn't seem to buffer when I ran it directly? What if I can't add $|=1 to the first program?


In reply to open() with a pipe by 7stud

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.