如何刷新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