[erlang-questions] Flush "stdout" buffer

Per Hedeland per@REDACTED
Sat Sep 2 13:08:36 CEST 2017


On 2017-09-02 10:07, Michael Truog wrote:
> On 09/01/2017 04:58 AM, Frank Muller wrote:
>> Can someone help on this please?
>>
> If you use stdout as an Erlang port like:
> 
> STDOUT =  erlang:open_port({fd, 0, 1}, [out, {line, 256}]),
> erlang:port_command(STDOUT, "unbuffered").

Can you actually observe a difference *in buffering* between doing that
and just

io:format("unbuffered").

?

> Then you don't need to flush stdout

You also don't need to flush after a call to io:format/1 as above.

> and you could probably flush stdout by just using erlang:port_command(STDOUT, "").

I can't believe that it would have any effect whatsoever.

> Doing output this way bypasses the io server

True. But the io server doesn't *buffer*, does it? Obviously there is
some amount of message passing and processing that you avoid by going
directly to a file descriptor port, but I really don't think you can
observe that difference in interactive use. If you are creating an
application for non-interactive use that will write lots of data on its
"stdout", your method is probably preferable though.

> and is useful for doing things like progress bars in Erlang source code.

I think the very trivial -eval snippet I posted in another reply
(io:format/1 interleaved with timer:sleep/1) clearly shows that you can
do progress bars just fine with io:format/1 too. But besides the
obvious, such that your progress bar will be printed on the remote node
instead of locally when running a remote shell, and that you lose the
functionality of io:format/2, I noticed a difference that I hadn't
foreseen:

If you are at a (e.g.) shell prompt, your method will just print on the
current line *after* the prompt, while io:format/1 will result in
"printing before" the prompt, i.e. the line is redrawn with the prompt
at the end. Both are pretty ugly but in different ways:-) though, and I
guess a progress bar is typically printed when you have given a
"command" and are waiting for the result - i.e. *not* at a prompt - in
which case there is again no observable difference.

--Per



More information about the erlang-questions mailing list