Erlangでioバッファをどのようにフラッシュしますか?
例えば:
> io:format("hello"),
> io:format(user, "hello").
この投稿は、明確な解決策がないことを示しているようです。
その投稿よりも良い解決策はありますか?
悲しいことに、io/kernel サブシステムにフラッシュ「コマンド」を適切に実装し、実際の io を実装する低レベル ドライバーがそのようなコマンドをサポートしていることを確認する以外に、システムを閉じる前に静止状態に頼る必要があります。失敗だと思います。
詳細については、stdlib の io.erl/io_lib.erl とカーネルの file_io_server.erl/prim_file.erl を参照してください。
例として、file_io_server (これは io/io_lib から要求を効果的に取得し、正しいドライバーにルーティングします) では、コマンドの種類は次のとおりです。
{put_chars,Chars}
{get_until,...}
{get_chars,...}
{get_line,...}
{setopts, ...}
(つまり、フラッシュなし)!
別の方法として、もちろん、書き込みのたびに常に出力を閉じることができます (これにより、フラッシュが強制されます)。私が持っているログモジュールは毎回このようなことをしますが、それほど遅くはないようです (キャストメッセージを介してログを受信した gen_server です):
case file:open(LogFile, [append]) of
{ok, IODevice} ->
io:fwrite(IODevice, "~n~2..0B ~2..0B ~4..0B, ~2..0B:~2..0B:~2..0B: ~-8s : ~-20s : ~12w : ",
[Day, Month, Year, Hour, Minute, Second, Priority, Module, Pid]),
io:fwrite(IODevice, Msg, Params),
io:fwrite(IODevice, "~c", [13]),
file:close(IODevice);
io:put_chars(<<>>)
スクリプトの最後に私のために働きます。
あなたは走ることができました
flush().
シェルから、または試してください
flush()->
receive
_ -> flush()
after 0 -> ok
end.
これは、多かれ少なかれ C フラッシュのように機能します。