2009-08-14 57 views
5

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

对于instace:

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

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

有没有更好的解决方案比在那个职位?

+0

对不起,我没有回答,只是一个问题。我非常好奇你为什么要冲洗io缓冲区,所以;为什么? :) – 2009-08-15 11:57:03

+0

AFAIK目前的io服务器实现是不可能的。您的链接已损坏,但是这是指由于缺少刷新操作而导致的问题:http://erlang.org/pipermail/erlang-questions/2011-April/057492.html – 2011-12-31 12:01:10

回答

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); 
+0

不是我曾经做过的,但从我的理解来看,实现一个io服务器并不是那么复杂,尤其是因为您可以将io_lib用于某些更复杂的请求。我认为你正在使用文件模块,使用文件:sync/1调用可以显式同步输出。它不会使用io-call来完成,而是自定义消息,除非将它与io:nl(IO)请求绑定。 – Christian 2009-08-16 12:32:35

-4

你可以运行

flush(). 

或者尝试

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

这或多或少像C刷新一样工作。

+3

这会刷新进程邮箱而不是io缓冲区。 – hcs42 2011-08-24 12:25:28

+0

@Fonz,我建议删除你的答案,因为它是无关的,保重! – securecurve 2013-12-28 10:25:07

0
io:put_chars(<<>>) 

在脚本的结尾适用于我。