5

你如何刷新 Erlang 中的 io 缓冲区?

例如:

> io:format("hello"),
> io:format(user, "hello").

这篇文章似乎表明没有干净的解决方案。

有比那个帖子更好的解决方案吗?

4

3 回答 3

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);
于 2009-08-16T04:25:42.943 回答
0
io:put_chars(<<>>)

在脚本的结尾对我有用。

于 2014-06-25T14:27:21.403 回答
-5

你可以跑

flush().

从外壳,或尝试

flush()->
receive
    _ -> flush()
after 0 -> ok
end.

这或多或少有点像 C 同花顺。

于 2009-12-07T01:46:42.833 回答