Leider andere als richtig einen Flush „command“ in den io/Kernel-Subsysteme und dafür, dass die Umsetzung, dass die niedrigen Level-Treiber, die die tatsächliche io Unterstützung einen solchen Befehl implementieren Sie wirklich einfach müssen auf dem System Stilllegungs verlassen vor Schließen. Ein Fehler, denke ich.
Schauen Sie sich ilo.erl/io_lib.erl in stdlib und file_io_server.erl/prim_file.erl im Kernel für die blutigen Details an.
Als Beispiel in file_io_server (die effektiv die Anforderung von io/io_lib und leitet sie an den richtigen Fahrer nimmt), sind die Befehlstypen:
{put_chars,Chars}
{get_until,...}
{get_chars,...}
{get_line,...}
{setopts, ...}
(das heißt kein Flush)!
Als Alternative könnten Sie natürlich Ihre Ausgabe (die einen Flush erzwingen würde) immer nach jedem Schreiben schließen. Ein Logging-Modul Ich habe etwas tut, wie dies jedes Mal, und es scheint nicht, dass langsam zu sein (es ist ein gen_server mit der Protokollierung über Guss Nachrichten empfangen):
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);
Sorry, ich habe keine Antwort, aber eine Frage. Ich bin unglaublich neugierig, warum du den io-Puffer spülen willst, also; Warum? :) –
AFAIK ist es nicht möglich mit der aktuellen IO-Server-Implementierung. Dein Link ist defekt, aber dieser bezieht sich auf ein Problem, das durch das Fehlen von Flush-Operationen verursacht wurde: http://erlang.org/pipermail/erlang-questions/2011-April/057492.html –