你如何刷新 Erlang 中的 io 缓冲区?
例如:
> io:format("hello"),
> io:format(user, "hello").
这篇文章似乎表明没有干净的解决方案。
有比那个帖子更好的解决方案吗?
可悲的是,除了在 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);
io:put_chars(<<>>)
在脚本的结尾对我有用。
你可以跑
flush().
从外壳,或尝试
flush()->
receive
_ -> flush()
after 0 -> ok
end.
这或多或少有点像 C 同花顺。