2009-08-14 8 views
5

Erlangでioバッファをどのようにフラッシュしますか? instaceについてはErlangでioバッファをフラッシュする方法は?

io:format("hello")または io:format(user, "hello")

This postにはきれいな解決策がないことを示していると思われます。

そのポストよりも優れた解決策がありますか?

+0

申し訳ありません申し訳ありませんが、質問はありません。なぜあなたがioバッファをフラッシュしたいのか、私は信じられないほど興味があります。どうして? :) –

+0

現在のioサーバーの実装では不可能です。あなたのリンクは壊れていますが、これはフラッシュ操作の不足によって引き起こされる問題を指します:http://erlang.org/pipermail/erlang-questions/2011-April/057492.html –

答えて

5

適切に実際のIOを実装し、低レベルのドライバは、あなたが本当に単に前に、システムの静止に依存する必要がこのようなコマンドをサポートすることを確認することIO /カーネル・サブシステムにフラッシュ「コマンド」を実施よりも悲しいことに他閉鎖。私は失敗していると思う。

stdlibのio.erl/io_lib.erlと、詳細については、カーネルのfile_io_server.erl/prim_file.erlを参照してください。例として

は、(有効IO/io_libから要求を受け取り、適切なドライバへの経路を)file_io_serverで、コマンドタイプがある:

{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を使用することができます。私はあなたがファイルを使用して、ファイルモジュールを使用して何かにいると思う:同期/ 1コールは、出力を明示的に同期することができます。これは、io呼び出しを使用して行われるのではなく、io:nl(IO)要求に結びつけない限り、カスタムメッセージです。 – Christian

-4

flush(). 
シェルから

、または多かれ少なかれCフラッシュのように動作します

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

を試してみてください。

+3

これはプロセスメールボックスをフラッシュし、ioバッファはフラッシュしません。 – hcs42

+0

@Fonz、私はあなたの答えを削除することをお勧めします。無関係なので注意してください! – securecurve

0
io:put_chars(<<>>) 

がスクリプトの最後にあります。

関連する問題