如何刷新Erlang中的io缓冲区?如何刷新Erlang中的io缓冲区?
对于instace:
io:format("hello")
或 io:format(user, "hello")
This post似乎表明,没有干净的解决方案。
有没有更好的解决方案比在那个职位?
如何刷新Erlang中的io缓冲区?如何刷新Erlang中的io缓冲区?
对于instace:
io:format("hello")
或 io:format(user, "hello")
This post似乎表明,没有干净的解决方案。
有没有更好的解决方案比在那个职位?
可悲的是除了在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服务器并不是那么复杂,尤其是因为您可以将io_lib用于某些更复杂的请求。我认为你正在使用文件模块,使用文件:sync/1调用可以显式同步输出。它不会使用io-call来完成,而是自定义消息,除非将它与io:nl(IO)请求绑定。 – Christian 2009-08-16 12:32:35
你可以运行
flush().
或者尝试
flush()->
receive
_ -> flush()
after 0 -> ok
end.
这或多或少像C刷新一样工作。
这会刷新进程邮箱而不是io缓冲区。 – hcs42 2011-08-24 12:25:28
@Fonz,我建议删除你的答案,因为它是无关的,保重! – securecurve 2013-12-28 10:25:07
io:put_chars(<<>>)
在脚本的结尾适用于我。
对不起,我没有回答,只是一个问题。我非常好奇你为什么要冲洗io缓冲区,所以;为什么? :) – 2009-08-15 11:57:03
AFAIK目前的io服务器实现是不可能的。您的链接已损坏,但是这是指由于缺少刷新操作而导致的问题:http://erlang.org/pipermail/erlang-questions/2011-April/057492.html – 2011-12-31 12:01:10