in reply to Reading from a command pipe

Hi. Thank you for your quick responses.

I have tried $mw->update() with no success. After reading the links about buffering I tried making the $cmd_handle hot, with select and $|=1 (didn't work either) and with autoflush (it threw an error).

The first comment helped me though to get into thinking. While running the cmd directly in the shell did a line by line output, when trying to pipe it also from the shell, e.g. cmd | less, it presents the same problems as invoking from the perl script.

So the problem must lay in the cmd I call. It is a c compiled program, but I also have the source code, so I will try my luck there now.

It is new and strange to me that outputing in STDOUT dumps line by line, but piping to another program is dumped block by block.

Thanks again for your help.

Replies are listed 'Best First'.
Re^2: Reading from a command pipe
by Eliya (Vicar) on Feb 09, 2012 at 15:25 UTC
    It is new and strange to me that outputing in STDOUT dumps line by line, but piping to another program is dumped block by block.

    This is the normal/default behavior.  Quoting from the man page of setvbuf(3)  (the C lib function to change the buffering mode):

    The three types of buffering available are unbuffered, block buffered, and line buffered. When an output stream is unbuffered, information appears on the destination file or terminal as soon as written; when it is block buffered many characters are saved up and written as a block; when it is line buffered characters are saved up until a newline is output or input is read from any stream attached to a terminal device (typically stdin). The function fflush(3) may be used to force the block out early. (See fclose(3).) Normally all files are block buffered. When the first I/O operation occurs on a file, malloc(3) is called, and a buffer is obtained. If a stream refers to a terminal (as stdout normally does) it is line buffered. The standard error stream stderr is always unbuffered by default.

    (emphasis mine)

    When you pipe stdout to another program, it is no longer connected to a terminal, hence it is block-buffered by default.