2009-08-14 59 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(<<>>) 

在腳本的結尾適用於我。