如何在Erlang中刷新io缓冲区?

时间:2009-08-14 23:57:39

标签: input erlang buffer flush

如何在Erlang中刷新io缓冲区?

对于instace:

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

This post似乎表明没有干净的解决方案。

有没有比那篇文章更好的解决方案?

3 个答案:

答案 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同花顺。