標準出力をフラッシュするには (flush)

プログラムが出力したものの、OSなどがバッファリングをしていて実際にはまだ出力されていないものを出力させる方法。

標準出力への出力は改行ごとに自動でフラッシュされるが、標準出力がパイプで別のプロセスにつながっている場合にはある程度の長さのバッファリングを自動で行われているプログラミング言語が多い。

Java

# 標準出力をflush
System.out.flush();

# 標準エラー出力をflush
System.err.flush();

Python

標準出力は改行ごとに自動でflushされるが、パイプで別のプロセスにつながっている場合、バッファリングされてしまう。

python起動時に -u オプションを付けると、バッファリングが無効になる。自分の環境で試したところ、 Python2で -u を付けると、改行に関係なく、出力した文字がその場でflushされる。 Python3で -u を付けると、改行ごとにflushされる。

Ruby

# 標準出力をflush
STDOUT.flush

# 標準エラー出力をflush
STDERR.flush

標準出力が端末だと少なくとも行単位ではflushしてくれるが、標準出力がパイプで他のプロセスとつながっていると明示的にflushしないと勝手にバッファリングされてしまうみたい。

Perl

以下は、行単位で自動でフラッシュさせる例 (バッファリングを無効にする方法)。

use IO::Handle; # autoflush関数を使うのであれば必要

# 標準出力のバッファリングを無効に
$| = 1;
# または
STDOUT->autoflush(1);

# 任意のファイルハンドルのバッファリングを無効に
my $tmpFh = select(FH);
$| = 1;
select($tmpFh);
# 一時的にそのファイルハンドルを標準出力にして、$l を設定する

# または
FH->autoflush(1);

Perlでバッファリング抑止
http://mikeda.hatenablog.com/entry/20090503/1241365884

select 関数 | perldoc.jp
http://perldoc.jp/func/select

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。