如何在Erlang中刷新io缓冲区?
对于instace:
io:format("hello")
或
io:format(user, "hello")
This post似乎表明没有干净的解决方案。
有没有比那篇文章更好的解决方案?
答案 0 :(得分:5)
遗憾的是,除了在io /内核子系统和中正确实现刷新“命令”之外,确保实现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);
答案 1 :(得分:0)
io:put_chars(<<>>)
脚本末尾的对我有用。
答案 2 :(得分:-5)
你可以跑
flush().
从shell获取,或尝试
flush()->
receive
_ -> flush()
after 0 -> ok
end.
这或多或少像C同花顺。