Purtroppo diverso da dare corretta attuazione di un "comando" flush nei sottosistemi IO/kernel e fare in modo che i driver di basso livello che implementano un tale comando il supporto reale io realmente devono fare affidamento semplicemente sulla essere messo in pausa sistema prima chiusura. Un fallimento, penso.
Dai un'occhiata a io.erl/io_lib.erl in stdlib e file_io_server.erl/prim_file.erl nel kernel per i dettagli cruenti.
Ad esempio, in file_io_server (che avviene effettivamente la richiesta da io/io_lib e instrada il driver corretto), i tipi di comando sono:
{put_chars,Chars}
{get_until,...}
{get_chars,...}
{get_line,...}
{setopts, ...}
(cioè senza filo)!
In alternativa, si potrebbe sempre chiudere l'output (che impone un flush) dopo ogni scrittura. Un modulo di registrazione ho fa qualcosa come questo ogni volta e non sembra essere che lento (si tratta di un gen_server con la registrazione ricevuti tramite messaggi del cast):
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);
Spiacente, non ho una risposta, ma una domanda. Sono incredibilmente curioso di sapere perché vorresti svuotare il buffer io, quindi; Perché? :) –
AFAIK non è possibile con l'attuale implementazione del server io. Il tuo link è rotto, ma questo si riferisce a un problema causato dalla mancanza di operazioni di flush: http://erlang.org/pipermail/erlang-questions/2011-April/057492.html –